Docker上にSqlServerをセットアップして、.dacpacの適用を行う
やりたいこと
Docker上にSqlServerをセットアップして、.dacpacの適用を行う。
前提条件
- .dacpacの取得方法について理解していること
- Linux、完全に理解した(プログラマースラング)の状態であること
- SqlServer、完全に理解した(プログラマースラング)の状態であること
- Docker、完全に理解した(プログラマースラング)の状態であること
実際にやること
- Docker上にSqlServerをセットアップする。
- .dacpacの適用を行う。
ここに書いたDockerfileがあります。
FROM mcr.microsoft.com/mssql/server:2017-latest as Builder ENV ACCEPT_EULA Y ENV SA_PASSWORD h0geFuga ENV MSSQL_PID Developer ENV MSSQL_LCID 1041 ENV MSSQL_MEMORY_LIMIT_MB 4096 RUN apt-get update && apt-get install -y --no-install-recommends unzip curl \ && apt-get clean \ && curl -Lq https://go.microsoft.com/fwlink/?linkid=873926 -o sqlpackage-linux-x64-latest.zip \ && ls -alh \ && unzip sqlpackage-linux-x64-latest.zip -d /opt/sqlpackage \ && chmod +x /opt/sqlpackage/sqlpackage \ && apt-get purge -y --auto-remove unzip \ && rm -rf /var/lib/apt/lists/* COPY KashiLogDB.dacpac /tmp/kashilogdb.dacpac RUN ( /opt/mssql/bin/sqlservr --accept-eula & ) | grep -q "Service Broker manager has started" \ && /opt/sqlpackage/sqlpackage /a:Publish /tsn:localhost /tec:False /tdn:KashiLogDB /tu:sa /tp:h0geFuga /sf:/tmp/kashilogdb.dacpac \ && rm /tmp/kashilogdb.dacpac \ && pkill sqlservr
Dockerfile Is 何
任意のパッケージ / アプリ、各種設定を含んだDocker Imageをbuildするための命令が書いてあるもの(雑説明)
Referenceはこちら
About FROM mcr.microsoft.com/mssql/server:2017-latest as Builder
docs.microsoft.com 上記ImageはUbuntu16.04-based。
About Env
全量はこっちを読むと全部書いてあります☆
今回設定したEnvironment Variables
- ACCEPT_EULA => 使用許諾契約書の承諾
- SA_PASSWORD => saアカウントのパスワード
- MSSQL_PID => SQLServerのエディションまたはプロダクトキーを設定。デフォルトはDeveloper
- MSSQL_LCID => 言語ID。日本語は1041を設定する
- MSSQL_MEMORY_LIMIT_MB => SQL Server が使用Ramの最大容量を設定する。 何もセットしないと既定値(物理Ramの合計容量の 80%)がセットされる。
About RUN apt-get update && apt-get install -y --no-install-recommends unzip curl \
apt-get update
apt-get update
を実行することで、apt-get install
するために、パッケージインデックスファイル(ダウンロード可能なパッケージのリストという理解)を更新する。
※ 下記ブログを読んで理解したつもりになりました。(ubuntuほぼわかってないので、理解したつもりになってるだけの可能性が高いです。) karoten512.hatenablog.com
apt-get install -y --no-install-recommends unzip curl \
unzipは、SqlPackageを解凍するため、curlは、SqlPackageをダウンロードするためにインストールしてます。 つまり、すべてはSqlPackageのためです。 .dacpacを処理するために必要なツールなので致し方ありません。(もっとうまい方法があるかは知らない。)
apt-get clean
Dockerfileのベストプラクティスに記述があるので付与。
help.ubuntu.com ubuntuのヘルプを見る感じ、apt-getからインストールされたファイルは [ /var/cache/apt/archives ]にキャッシュされ、アプリを削除した後もキャッシュは残るのでクリアしようという理解でいる。(なお正しいかどうかはあまりよくわからない。)
curl -Lq https://go.microsoft.com/fwlink/?linkid=873926 -o sqlpackage-linux-x64-latest.zip \
sqlPackageのダウンロード(Linuxビギナーなのでついでにメモ。)
- -l:Locationを指定
- -q:FTPサーバーに対するコマンド
- -o:出力ファイル名
unzip sqlpackage-linux-x64-latest.zip -d /opt/sqlpackage
ダウンロードしたsqlpackageの解凍
chmod +x /opt/sqlpackage/sqlpackage
+xで実行権限付与(Linuxビギナーなのでついでにメモ。)
apt-get purge -y --auto-remove unzip
unzip パッケージの削除
rm -rf /var/lib/apt/lists/*
docs.docker.jp /var/lib/apt/lits を削除することで、イメージのサイズを減らすのがベストプラクティスなのでコピペ。
COPY KashiLogDB.dacpac /tmp/kashilogdb.dacpac
.dacpacのコピー
RUN ( /opt/mssql/bin/sqlservr & ) | grep -q "Service Broker manager has started"
SqlServerをバックグラウンドで実行し、起動完了のメッセージが出力される(=起動確認が取れる)ことの確認。 〇参考にしたのはこちら www.wintellect.com
grep -q "Service Broker manager has started"
が正道なのかはよくわからず。
10s waitする、みたいなコード例も見かけたが、それよりはこちらのほうが筋が良い気がしたので、今回は一先ずこちらを採用した。
/opt/sqlpackage/sqlpackage /a:Publish /tsn:localhost /tec:False /tdn:KashiLogDB /tu:sa /tp:h0geFuga /sf:/tmp/kashilogdb.dacpac
docs.microsoft.com SqlPackage.exe公開操作をやりたいので、上記を参考に設定
- /a => 実行アクション名を指定(公開操作の場合、Publishに指定)
- /tsn => ターゲットデータベースをホストしているサーバー名
- /tec => ターゲットデータベース接続にSQL暗号化を使用するかどうかの指定
- /tdn => sqlpackage.exeアクションのターゲットデータベース名
- /tu => ターゲットデータベースへのアクセスに使用するSQLServerユーザー
- /tp => ターゲットデータベースへのアクセスに使用するパスワード
- /sf => アクションのソースとして使用されるファイルの指定
rm /tmp/kashilogdb.dacpac
dacpacの削除
pkill sqlservr
SQLServerのプロセスをキル
DockerfileのBuild
docker build -t kashilogdb .
カレントディレクトリなのでドットを指定する。(誤字にあらず。)
BuildしたDockerImageからContainerを立ち上げる
docker run --name kashilogtestdb -d -p 15331:1433 kashilogtestdb
-pは露出ポートの設定
パラメーターの詳細はこちら