Docker Compose で MySQL コンテナを立てるときに MYSQL_ROOT_PASSWORD 環境変数の指定でハマった
結論
- Docker Compose のサービスの環境変数は Hash 形式で設定するのがおすすめ
environment: MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' MYSQL_ROOT_PASSWORD: '' # **空文字列** がパスワードとして設定される
docker-compose down db
だけだと、db
コンテナに紐づく volume は削除されない。MYSQL_ROOT_PASSWORD
周りの環境設定を書き換えた後は、ボリュームを含めて削除する必要がある
背景
- docker-compose で開発環境用の MySQL サービスを用意した
- 開発環境用の MySQL サーバは、用途的に root ユーザのパスワードが不要
- Docker 公式 MySQL イメージは、コンテナ初回起動時に
MYSQL_ALLOW_EMPTY_PASSWORD
環境変数を設定しておけば、空文字列のパスワードで MySQL ルートユーザを作ってくれる- (厳密には)ボリュームに MySQL のデータディレクトリがなければ、ユーザを作る実装
- https://github.com/docker-library/mysql/blob/fc3e856313423dc2d6a8d74cfd6b678582090fc7/5.6/docker-entrypoint.sh#L98
MYSQL_ALLOW_EMPTY_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
しても、オプション無しではサービスがマウントしているボリュームが削除されない
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="" # 「""」がパスワードとして設定される