docker-composeでMicrosoft SQL Server 2019を動かすまで

## 最初に結論

```powershell
docker-compose up -d
```
じゃあ動かなかったんだよぉ。

```powershell
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する

```powershell
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 コンテナー イメージを実行する](https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-powershell#pull-and-run-the-2019-container-image)より引用)
分には動くんですよ。
でも、

```yml:docker-compose.yml
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
```

```ini:sql-server-2019.env
# 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```を見てやると

```text:logメッセージ
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のこちらのページ](https://qiita.com/wasanx25/items/d47caf37b79e855af95f#%E3%81%9D%E3%81%AE%E4%BB%96)の下の方

```powershell:コマンドライン
docker-compose up -d --build
```

**ん? --build なにそれ?**
状態だったのですが、結論から言えばこれをつけて一度イメージをビルドしてやらないとEULAの設定が入らなかったというのが原因のようです(ただし詳しい所は判らないビルドしないと環境変数が設定されないのかなぁ?そこんとこ詳しい人お願いします)。
なお、一度EULAの設定が通ってしまえば```docker-compose rm```しても「何故か」```docker-compose up -d```で普通に起動するようになります。(どっかにEULAの設定が残ってるって事???)

## おわりに
とりあえずは「建った!!SQL Server 2019が建った!!dockerのおかげでめんどくさいインストール作業しなくてもサーバーサービスが建った!!!!」と「クララ、大地に立つ」的な喜びの下、本記事を書いたことをここに記しておきます。

```powershell:Test-Connectionでポートの開放確認
Test-Connection -TargetName localhost -TcpPort 1433
```
も```True```が返ってきたので、これでおそらく問題無く接続できることでしょう。

**まぁ、まだSQL Server Management Studioで接続してないんだけどね!!**

(終われ)

## 参考文献
[Microsoftドキュメント: SQL Server Docker コンテナーをデプロイして接続する](https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-docker-container-deployment?view=sql-server-ver15&pivots=cs1-powershell), 本家様の解説記事
[Microsoftドキュメント: クイック スタート:Docker を使用して SQL Server コンテナー イメージを実行する](https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-powershell), docker runコマンドについてはここから引っぱってきた
[Qiita: docker-compose コマンドまとめ](https://qiita.com/wasanx25/items/d47caf37b79e855af95f), 今回の神。ありがとうございますm(_ _)m
[Docker Hub: Microsoft SQL Server](https://hub.docker.com/_/microsoft-mssql-server?tab=reviews), レビュー欄を見てると「起動しねぇじゃねぇか」派VS「Documentation読め」派が居る印象。
[LinuxTut.com Run SQL Server with Docker ToolBox](https://linuxtut.com/en/374649203fb56811a01e/), メモリが2,000MB以上ないと「メモリー足りないから無理」って怒られて今回と同様のエラー吐いて起動しないらしい。
[GitHub: Docker run command fails with Accept-Eula Agreement error](https://github.com/microsoft/mssql-docker/issues/199), 「PowerShellユーザーは'(シングルクォート)じゃなくて"(ダブルクォート)だって言ってんだろ」(結論)