1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Docker×MySQL】compose.yamlの設定通りにMySQLユーザーが作成されない

Last updated at Posted at 2024-07-04

はじめに

DockerでMySQL環境を作成したところ、compose.yamlで設定した環境変数が反映されず、MySQLユーザーが作成されませんでした。この原因と対処法について記載します。

環境

  • Windows10
  • Docker Desktop:26.1.1
  • MySQL: 5.7

設定ファイル

本エラーに関係ありそうなcompose.yamlの一部を記載します。

特に注目していただきたいのはenvironmentMYSQL_USERです。
ここで作成したいユーザー名を指定しています。

compose.yaml
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に記載しています。

.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になるはずなのに、、

環境変数USERNAMEWindowsPCで設定されているユーザー名wsigma21」になってしまっています。

コマンドプロンプトで環境変数を確認してみます。

> set
~~ 省略 ~~
USERNAME=wsigma21
~~ 省略 ~~

やはりWindowsPCの環境変数USERNAMEが反映されているようです。.envでの設定よりこちらが勝ってしまうのでしょう。

解決

環境変数名が被らなければよいので、適当にUSER_NAMEにしてみます。

(設定ファイルの該当箇所だけ示します)

compose.yaml
environment:
       MYSQL_USER: ${USER_NAME}
.env
USER_NAME=docker

その後volumeを再作成します(対処法1の知見は無駄ではなかった)。

$ docker compose down --volumes
$ docker compose up --detach

これで無事に解決しました!

おわりに

同じ状態に陥る人がどれくらいいるのかわかりませんが、、どなたかの助けになれば幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?