最初に結論
docker-compose up -d
じゃあ動かなかったんだよぉ。
docker-compose up -d --build
で初めて動いたんだよぉ。
というわけで、リモートリポジトリからダウンロードしてきたイメージでも最初に起動するときには--build
した方が幸せになれるみたいと言う話です。
経緯
ちょいと年末仕事収まらなかった関係で、自宅でもSQL ServerのExpress EditionでDBいじくりたいぞ‼
でもSQL Serverのフルセットインストールとか嫌なんだぞ‼
そうだ。dockerコンテナ。使おう。
そんな単純な動機で始めたMicrosoft SQL Server 2019 Express をdockerで動かすという簡単な作業の筈が、「docker-composeを使うと」嵌まったので、備忘録としてここに何故嵌まったのかと対策をどうすれば良いかについて記述しておきたいと思います。
どこで嵌まってたのか
結論としてはACCEPT_EULA=Y
がすべての元凶なのです。
ただしこいつ、普通に以下のようにdocker runする
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" `
-p 1433:1433 --name sql1 -h sql1 `
-d mcr.microsoft.com/mssql/server:2019-latest
(Microsoft SQL ドキュメント クイック スタート:Docker を使用して SQL Server コンテナー イメージを実行するより引用)
分には動くんですよ。
でも、
version: "3"
services:
mssql:
image: mcr.microsoft.com/mssql/server:2019-latest
container_name: sql-server-2019-express
ports:
- 1433:1433
environment:
- ACCEPT_EULA=Y
env_file:
- sql-server-2019.env
volumes:
- ./DB/DATA:/var/opt/mssql/data
- ./DB/LOG:/var/opt/mssql/log
- ./DB/secrets:/var/opt/mssql/sec
# saアカウントのパスワード
SA_PASSWORD=<S0ME_LOVELY_PHR@SES>
# SQL Server のエディション(Express版に設定)
MSSQL_PID=Express
# ロケール設定(日本語を選択)
MSSQL_LCID=1041
# 日本語の判定設定
MSSQL_COLLECTION=Japanese_CI_AS
# タイムゾーン設定
TZ="Asia/Tokyo"
# SQL Agentサービスの使用可否
MSSQL_AGENT_ENABLED="true"
ってな感じでservices.mssql.environmentにACCEPT_EULA=Yを設定してdocker-compose up -d
してもちっとも動いてくれない。それどころかdocker-compose logs
を見てやると
You can accept the EULA by specifying the --accept-eula command line option,
setting the ACCEPT_EULA environment variable, or using the mssql-conf tool.
Exited with code 1
だそうで「EULAに同意してないから落とすからね‼」と怒られてしまうわけですよ。
んで、色々色々巡った末、解決したのがQiitaのこちらのページの下の方
docker-compose up -d --build
ん? --build なにそれ?
状態だったのですが、結論から言えばこれをつけて一度イメージをビルドしてやらないとEULAの設定が入らなかったというのが原因のようです(ただし詳しい所は判らないビルドしないと環境変数が設定されないのかなぁ?そこんとこ詳しい人お願いします)。
なお、一度EULAの設定が通ってしまえばdocker-compose rm
しても「何故か」docker-compose up -d
で普通に起動するようになります。(どっかにEULAの設定が残ってるって事???)
おわりに
とりあえずは「建った!!SQL Server 2019が建った!!dockerのおかげでめんどくさいインストール作業しなくてもサーバーサービスが建った!!!!」と「クララ、大地に立つ」的な喜びの下、本記事を書いたことをここに記しておきます。
Test-Connection -TargetName localhost -TcpPort 1433
もTrue
が返ってきたので、これでおそらく問題無く接続できることでしょう。
まぁ、まだSQL Server Management Studioで接続してないんだけどね!!
(終われ)
参考文献
Microsoftドキュメント: SQL Server Docker コンテナーをデプロイして接続する, 本家様の解説記事
Microsoftドキュメント: クイック スタート:Docker を使用して SQL Server コンテナー イメージを実行する, docker runコマンドについてはここから引っぱってきた
Qiita: docker-compose コマンドまとめ, 今回の神。ありがとうございますm(_ _)m
Docker Hub: Microsoft SQL Server, レビュー欄を見てると「起動しねぇじゃねぇか」派VS「Documentation読め」派が居る印象。
LinuxTut.com Run SQL Server with Docker ToolBox, メモリが2,000MB以上ないと「メモリー足りないから無理」って怒られて今回と同様のエラー吐いて起動しないらしい。
GitHub: Docker run command fails with Accept-Eula Agreement error, 「PowerShellユーザーは'(シングルクォート)じゃなくて"(ダブルクォート)だって言ってんだろ」(結論)