Docker Compose で MySQL コンテナを立てるときに MYSQL_ROOT_PASSWORD 環境変数の指定でハマった

結論

  1. Docker Compose のサービスの環境変数は Hash 形式で設定するのがおすすめ
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
MYSQL_ROOT_PASSWORD: '' # **空文字列** がパスワードとして設定される
  1. docker-compose down db だけだと、db コンテナに紐づく volume は削除されない。MYSQL_ROOT_PASSWORD 周りの環境設定を書き換えた後は、ボリュームを含めて削除する必要がある

背景

罠1. 配列形式で環境変数を指定したときの解釈

配列形式の環境変数指定の場合、""空文字列ではなく、ダブルクオーテーション 2 文字("")の文字列として解釈されて、MySQL ユーザが作成される。

environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_ROOT_PASSWORD="" # 「""」がパスワードとして設定される

この挙動はパット見ではすぐ気づけないので、以下のような Hash 形式で指定するのがおすすめ。

environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
MYSQL_ROOT_PASSWORD: '' # **空文字列** がパスワードとして設定される

そもそもこのケースの場合、パスワードが空なので MYSQL_ROOT_PASSWORD 環境変数の指定は不要である。

environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'

罠2. docker-compose down db だと volume は削除されない

  • docker-compose down db しても、オプション無しではサービスがマウントしているボリュームが削除されない
    • MySQL コンテナのデータは、MySQL ユーザも含めボリュームに永続化されるため、 docker-compose down しても作成した MySQL ユーザは削除されない
    • MYSQL_ROOT_PASSWORD 周りの環境設定を書き換えた後は、ボリュームを含めて削除する必要がある

docker-compose down docker-compose up して試行錯誤中の環境変数を試してみるも、docker-compose down だけだと MySQL ユーザが削除されない。環境変数の設定値を試行錯誤するうちに、MYSQL_ALLOW_EMPTY_PASSWORD が正しく設定された MySQL ユーザが知らないうちに作られてしまっていたため、以下の記述をすればまっさらな環境でも空パスワードの MySQL ユーザができると勘違いしていた。

# 誤った記述
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_ROOT_PASSWORD="" # 「""」がパスワードとして設定される