Docker上にSqlServerをセットアップして、.dacpacの適用を行う

やりたいこと

Docker上にSqlServerをセットアップして、.dacpacの適用を行う。

前提条件

実際にやること

  • 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はこちら

docs.docker.jp

About FROM mcr.microsoft.com/mssql/server:2017-latest as Builder

docs.microsoft.com 上記ImageはUbuntu16.04-based。

About Env

全量はこっちを読むと全部書いてあります☆

docs.microsoft.com

今回設定した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

docs.docker.jp

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は露出ポートの設定

パラメーターの詳細はこちら

docs.docker.jp