docker-composeのmysql: environment: の設定が反映されない!
ぺーぺーの筆者もようやくDockerに触る機会ができ、早速docker-composeを使って公式のMySQLを利用して環境を作ろうとしました。
この際、rootのパスワードも変更したかったため、docker-compose.ymlは最終的にこんな感じになりました。
version: '2'
services:
#(前略)
mysql:
image: "mysql"
environment:
MYSQL_ROOT_PASSWORD: NantokaKantoka
#最初のうちはhogefugaを設定していた
MYSQL_DATABASE: myDatabase
volumes:
- ./mysql/conf.d:/etc/mysql/conf.d
#mysql.cnfを反映させるため
- ./mysql/data:/var/lib/mysql
#DBの実体をおいておく
- ./mysql/init:/docker-entrypoint-initdb.d
#MySQL初回起動時の走らせたいsqlとかshとかを渡すため
#(後略)
この設定なら、myDatabaseというデータベースが作られた上、rootログインする時にはNantokaKantokaというパスワードが必要になるはずでした。
ですが実際にはmyDatabaseは作られずパスワードは最初のうちに設定していたhogefugaのまま変更されないという事態になりました。
docker-compose downとかdocker rm $(docker ps -aq)とか色々やっても何回やってもこの現象に悩まされました。
公式のMySQLイメージは起動時に既存のDBをいじらない
いろいろ探し回った末に公式のmysqlイメージのページを参照してみることにした結果原因がわかりました。
問題の箇所の原文と和訳を記します。
Environment Variables
When you start the mysql image, you can adjust the configuration of the MySQL instance by passing one or more environment variables on the docker run command line. Do note that none of the variables below will have any effect if you start the container with a data directory that already contains a database: any pre-existing database will always be left untouched on container startup.
環境変数
mysqlのイメージを起動する際に、docker runコマンドラインにいくつかの環境変数を渡すことで、MySQLインスタンスの設定を調整できます。もし既にデータベースを格納しているデータディレクトリとともにコンテナを起動した場合は、下記の変数はどれも影響を及ぼさないことに留意してください。コンテナが起動する際には既存のデータベースには常に何の変更も加えません。
大事なとこここです。
もし既にデータベースを格納しているデータディレクトリとともにコンテナを起動した場合は、下記の変数はどれも影響を及ぼさないことに留意してください。
つまり原因はここです。
- ./mysql/data:/var/lib/mysql
#DBの実体をおいておく
こいつにもともとデータベースがあったためにパスワードなどの変更を加えることができず、結果最初の方に設定していたhogefugaがパスワードとして残り続けたんですね。
myDatabaseのデータベースが作られなかったのも同様の理由です。
解決
rm -rf ./mysql/data/* ; docker-compose up -d
docker execでコンテナに入ると、無事パスワードが変更され、データベースも作られていることを確認できました。
結論
公式をあたれ