DockerでSQL Serverのデータベースをリストアして起動する
はじめに
これまでSQL Serverを利用した開発は、EC2インスタンスを使用していました。
Dockerを使うと手元の環境で SQL Server を起動して開発を行う事が出来るので
今回はDockerの利点である環境の自動構築を行い、接続までの手順をまとめます。
開発環境
・Widnows10 Pro
・Docker Engine Community Version 20.10.5
使用するファイル
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 を使用して接続ができることを確認しました。
参考資料
macでSQL Server on Linuxコンテナに自動でサンプルDBを取り込む手順 – お役立ち情報サイト・アレアレ
Docker + MySQLで開発環境用DBの作成 - もぐもぐプログラミング
Dockerfileを書き換えても反映されないときはbuild忘れ | へっぽこ開発室
[Windows] Dockerを使用してホスト環境を汚さずにmssql-server-linuxを使う | LaptrinhX
sleep: command not found - Query Admin
SQL Server on Linux for Docker でのエラー対策 - 蒼の王座・裏口
sql server - Restore database in docker container - Stack Overflow
Create Login, User, assign Permission: SQL Server Tutorial
sql server - TSQL to Map User to Database - Stack Overflow