docker-compose.ymlでのMYSQL_ROOT_PASSWORDの設定困る。
前提
今勉強で作っている環境でMySQLを使うのですが、docker-compose.ymlにMySQLの情報を記載して、勉強の時に簡単に同じ環境を作れるようにしたいと考えました。
今の環境は
docker-compose : Docker Compose version v2.24.6-desktop.1
mysqlイメージ : original_mysql_world
困った点
さて、docker-compose.ymlでDBの設定を書き込む場合には、MYSQL_ROOT_PASSWORDで設定してあげる必要があります。
MYSQL_ROOT_PASSWORDは必須の変数で、これを省くとDockerの起動時に
Database is uninitialized and password option is not specified
You need to specify one of the following as an environment variable:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
というエラーがでて、つまり設定忘れないでねと言われます。
ここで困るのが、たとえばMYSQL_ROOT_PASSWORD="password"で設定すると、「いくら勉強でもgithubにこのままあげるたら人に見られた時にアホの子だと思われそう。。」
ということ。
「docker-compose upで動くことが確認できたら後で設定すればいい話なのかもしれないな。。」とは思いつつ、デファクトスタンダードはどれなんだかわからないので平文でパスワード載せないように工夫をしたいと思いました。
解決策
1. MYSQL_ALLOW_EMPTY_PASSWORDを使う
この変数を記述してyesを設定すると、rootユーザのパスワードが空で起動できます。
ただ普通にセキュリティ的にだめすぎるので、よくないですね。
一応無事起動するのを確認。
2. MYSQL_RANDOM_ROOT_PASSWORDとMYSQL_ONETIME_PASSWORDを使う
MySQLのリファレンスに書いてあった推奨の方法です。
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MYSQL_ONETIME_PASSWORD: "true"
のように設定して使います。
dockerのビルドの時にログに下のような表示でパスワードが記載されるので、これを使ってログインが可能です。
GENERATED ROOT PASSWORD: ~~~~~~~~~
これ一回入ったらもうこのパスワードが使えなくなるって意味だと思って設定してみたけど全然そんなことない。
どういう使い方なんだろうか。。
ちなみにこれらのブール変数は長さが0以外の文字列だとtrueを設定しているのと等価です。
3.外部ファイルに記述する
今までは
mysql:
build:
context: ./db_Mysql
dockerfile: docker/db/Dockerfile
volumes:
- ./db_Mysql/db:/db
image: original_mysql_world
environment:
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MYSQL_ONETIME_PASSWORD: "true"
という感じでenvironmentの中に変数を記載してましたが、環境ファイルを作って参照してもらう場合には、env_fileで指定してあげます。
mysql:
build:
context: ./db_Mysql
dockerfile: docker/db/Dockerfile
volumes:
- ./db_Mysql/db:/db
image: original_mysql_world
env_file: env/db_env
これも予定通り無事起動、db_envに記載してるパスワードでmysqlに入れました。
結論
環境変数を別ファイルで設定して、.gitignoreつければよい。と思う。
参考文献
パスワードはこれでも確認できるらしい。自分は普通にdocker desktopから履歴を見たけれど。