はじめに
DockerでMySQL環境を作成したところ、compose.yamlで設定した環境変数が反映されず、MySQLユーザーが作成されませんでした。この原因と対処法について記載します。
環境
- Windows10
- Docker Desktop:26.1.1
- MySQL: 5.7
設定ファイル
本エラーに関係ありそうなcompose.yamlの一部を記載します。
特に注目していただきたいのはenvironment
のMYSQL_USER
です。
ここで作成したいユーザー名を指定しています。
services:
app:
~~ 省略 ~~
mysql:
image: mysql:5.7
container_name: db-for-go
command:
~~ 省略 ~~
environment:
MYSQL_ROOT_PASSWORD: ${ROOTPASS} # rootのパスワード
MYSQL_DATABASE: ${DATABASE} # データベースの名称
MYSQL_HOST: db-for-go # コンテナ名を指定
MYSQL_USER: ${USERNAME} # 作成したいユーザー名
MYSQL_PASSWORD: ${USERPASS} # 作成したいユーザーのパスワード
TZ: 'Asia/Tokyo'
ports:
- "3306:3306"
volumes:
~~ 省略 ~~
volumes:
db-volume:
MySQLの環境変数について、詳細は以下の公式ページをご確認ください。
compose.yamlで指定した環境変数の値は.envに記載しています。
ROOTPASS=password
DATABASE=sampledb
USERNAME=docker
USERPASS=docker
エラー
作成したDockerユーザーでログインしようとしてもできません。。
> docker container exec `
>> --interactive `
>> --tty `
>> db-for-go `
>> mysql -h localhost -u docker sampledb -p
Enter password:
ERROR 1045 (28000): Access denied for user 'docker'@'localhost' (using password: YES)
一応ここでcompose.yamlと.envの変数名のタイプミスがないことを確認します
(それで解決すること、よくありますよね)。
対処法1:volumeを再作成する
"Docker MySQL ユーザー作成できない"で検索すると、古いvolumeが残っているためにcompose.yamlを編集してリビルドしてもユーザーが作成されない例がいくつもヒットします。
上記の記事の通り、この場合はいったんvolumeを削除してから起動することで解決します。
$ docker compose down --volumes
$ docker compose up --detach
おそらく9割以上の人がこれで一件落着でしょう。しかし、筆者の場合はこれで解決しませんでした。。
対処法2:環境変数を確認する
「.envで指定した環境変数が上手く設定されていないのかも」と思い、MySQLコンテナ内で$ printenv
を実行し環境変数を確認しました。
> docker container exec `
>> --interactive `
>> --tty `
>> db-for-go `
>> bash
bash-4.2# printenv
HOSTNAME=44aa7bf0faec
TERM=xterm
MYSQL_VERSION=5.7.44-1.el7
MYSQL_DATABASE=sampledb
MYSQL_PASSWORD=docker
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
MYSQL_SHELL_VERSION=8.0.35-1.el7
TZ=Asia/Tokyo
SHLVL=1
HOME=/root
MYSQL_MAJOR=5.7
GOSU_VERSION=1.16
MYSQL_HOST=db-for-go
MYSQL_USER=wsigma21 # ここがおかしい
MYSQL_ROOT_PASSWORD=password
_=/usr/bin/printenv
ん?
compose.yamlでMYSQL_USER: ${USERNAME}
、.envでUSERNAME=docker
としているのだから、MYSQL_USER=docker
になるはずなのに、、
環境変数USERNAME
がWindowsPCで設定されているユーザー名「wsigma21
」になってしまっています。
コマンドプロンプトで環境変数を確認してみます。
> set
~~ 省略 ~~
USERNAME=wsigma21
~~ 省略 ~~
やはりWindowsPCの環境変数USERNAME
が反映されているようです。.envでの設定よりこちらが勝ってしまうのでしょう。
解決
環境変数名が被らなければよいので、適当にUSER_NAME
にしてみます。
(設定ファイルの該当箇所だけ示します)
environment:
MYSQL_USER: ${USER_NAME}
USER_NAME=docker
その後volumeを再作成します(対処法1の知見は無駄ではなかった)。
$ docker compose down --volumes
$ docker compose up --detach
これで無事に解決しました!
おわりに
同じ状態に陥る人がどれくらいいるのかわかりませんが、、どなたかの助けになれば幸いです。