Grow up

生活とプログラミング

DockerでSQL Serverのデータベースをリストアして起動する

f:id:knkomko:20210430223349p:plain

はじめに

これまでSQL Serverを利用した開発は、EC2インスタンスを使用していました。
Dockerを使うと手元の環境で SQL Server を起動して開発を行う事が出来るので
今回はDockerの利点である環境の自動構築を行い、接続までの手順をまとめます。

開発環境

・Widnows10 Pro
・Docker Engine Community Version 20.10.5

全体像

docker compose コマンドで環境の自動構築を行う時にSQL ServerのバックアップファイルをリストアすることでEC2利用時と同じデータベースを再現します。

f:id:knkomko:20210430223815p:plain

使用するファイル
C:\DOCKER\SAMPLE-MSSQL
│  docker-compose.yml
│
├─ mssql
│      db-init.sh
│      ddl.sql
│      Dockerfile
│      entrypoint.sh
│
├─ mssql-backup
│      sampledb.bak
│
└─ mssql-data
docker-compose.yml
version: '3'

services:
   db:
     build: 
      context: ./mssql/
      dockerfile: ./Dockerfile
     container_name: sample-mssql-2017
     ports:
      - "1433:1433"
     environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=Sa@mple@dm1n
      - MSSQL_PID=Express
      - MSSQL_LCID=1041
      - MSSQL_COLLATION=Japanese_CI_AS
      - PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
     volumes:
      - ./mssql-data:/var/opt/mssql
      - ./mssql-backup:/var/opt/mssql/data/backup
Dockerfile
FROM mcr.microsoft.com/mssql/server:2017-latest

COPY ./entrypoint.sh /usr/src/entrypoint.sh
COPY ./db-init.sh /usr/src/db-init.sh
COPY ./ddl.sql /usr/src/ddl.sql

WORKDIR /usr/src/

RUN chmod +x /usr/src/db-init.sh

CMD /bin/bash ./entrypoint.sh
entrypoint.sh

デバッグし易いように db-init.sh の実行ログを log.txt として残しています。

 ./db-init.sh >> /var/opt/mssql/data/backup/log.txt 2>&1 & /opt/mssql/bin/sqlservr
db-init.sh

25s の待ち時間はリストアを行う為にSQL Serverが起動するまで待ちます。
10s の待ち時間はデータベースユーザを追加する為にリストアの終了を待ちます。

/bin/sleep 25s

touch /var/opt/mssql/data/sampledb.mdf
touch /var/opt/mssql/data/sampledb_Log.ldf

/opt/mssql-tools/bin/sqlcmd -H localhost -U sa -P S@mple@dm1n -Q "RESTORE DATABASE sampledb FROM DISK = '/var/opt/mssql/data/backup/sampledb.bak' WITH  FILE = 1, STATS = 5, REPLACE, MOVE 'sampledb' TO '/var/opt/mssql/data/sampledb.mdf', MOVE 'sampledb_Log' TO '/var/opt/mssql/data/sampledb_Log.ldf'"

/bin/sleep 10s

/opt/mssql-tools/bin/sqlcmd -H localhost -U sa -P S@mple@dm1n -i /usr/src/ddl.sql
ddl.sql
EXECUTE AS LOGIN = 'sa'

USE sampletable
GO

DROP USER SampleUser

CREATE USER SampleUser  for login SampleUser

ALTER USER SampleUser 
    WITH DEFAULT_SCHEMA = dbo
GO

GRANT CONNECT TO SampleUser
GO

exec sp_addrolemember 'db_owner', SampleUser
GO
SQL Server の起動
docker compose up --build
SQL Server の接続

SQL Server Management Studio を使用して接続ができることを確認しました。
f:id:knkomko:20210430221003p:plain