質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.11%

`docker-compose.yml`の`environment`要素がコンテナに正しく反映されない原因とその対策方法

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 467

task4233

score 34

質問・実現したいこと

docker-compose.ymlenvironment要素が, コンテナに正しく反映されない原因とその対策方法を教えていただきたいです。

問題は, 以下のdocker-compose.ymlで起きていると考えています。
以下のdocker-compose.ymlでは, environmentの要素として, 

  • MYSQL_ROOT_PASSWORD
  • MYSQL_USER
  • MYSQL_PASSWORD

を定義しています。
しかし, この情報がdocker-compose up -dで立てたコンテナ内に反映されていませんでした。

# docker-compose.yml
version: '3'

services:
  # MySQL
  db:
    image: mysql:8.0
    container_name: mysql_host
    environment:
      MYSQL_ROOT_PASSWORD: root # rootのpassをrootに設定
      MYSQL_DATABASE: sampleDB   
      MYSQL_USER: docker         # dockerというユーザを定義
      MYSQL_PASSWORD: docker     # そのユーザのpassをdockerに設定
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306

試したこと・確認したこと

上で提示したファイルを元にdocker-compose up -dでコンテナを生成してdocker execでコンテナ内に入り, 直接作業mysqlコマンドを使用しようとしました。

しかし, 以下のように
mysql -uroot -prootでインタラクティブシェルを開こうとしても, 
mysql -udocker -pdockerでインタラクティブシェルを開こうとしてもAccess deniedされてしまいました......

// shell
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
bc38faeb99a6        mysql:8.0           "docker-entrypoint.s…"   8 seconds ago       Up 6 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql_host
$ docker exec -it bc38 /bin/bash
root@bc38faeb99a6:/# mysql -uroot -p      
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
root@bc38faeb99a6:/# mysql -udocker -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'docker'@'localhost' (using password: YES)

この結果から, そもそもdocker-compose.ymlenvironmentで設定したはずの要素が正しく反映されていないものと考え, このような質問を投稿しています。

また, 他に情報が欲しい場合は, コメントしていただければ追記いたします。
なにとぞ, よろしくお願いします。

追記

コンテナ内で確認した環境変数の内容

環境変数は正しく反映されているらしいです...
では何故mysql自体に反映されていないのでしょうか...?

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                               NAMES
02a3b0b8f72d        mysql:8.0           "docker-entrypoint.s…"   2 seconds ago       Up Less than a second   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql_host
$ docker exec -it 02a /bin/bash
root@02a3b0b8f72d:/# env    
MYSQL_PASSWORD=docker
TZ=Asia/Tokyo
HOSTNAME=02a3b0b8f72d
MYSQL_DATABASE=sampleDB
MYSQL_ROOT_PASSWORD=root
PWD=/
HOME=/root
MYSQL_MAJOR=8.0
GOSU_VERSION=1.7
MYSQL_USER=docker
MYSQL_VERSION=8.0.16-2debian9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

docker-compose logs db で見れるログ

以下の通りです。

私としては, まず4行目の[Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.が問題だと考えています。
なぜなら, docker-compose.ymlで設定したはずだからです。
何故なのか...

Attaching to mysql_host
mysql_host | Initializing database
mysql_host | 2019-06-09T05:25:15.104523Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
mysql_host | 2019-06-09T05:25:15.106187Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.16) initializing of server in progress as process 28
mysql_host | 2019-06-09T05:25:24.300438Z 5 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
mysql_host | 2019-06-09T05:25:30.689081Z 0 [System] [MY-013170] [Server] /usr/sbin/mysqld (mysqld 8.0.16) initializing of server has completed
mysql_host | Database initialized
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | 2019-06-09T05:25:33.999456Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
mysql_host | 2019-06-09T05:25:34.006555Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.16) starting as process 79
mysql_host | 2019-06-09T05:25:36.482160Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql_host | 2019-06-09T05:25:36.509381Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql_host | 2019-06-09T05:25:36.581626Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.16'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server - GPL.
mysql_host | 2019-06-09T05:25:36.843695Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock'
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process in progress...
mysql_host | MySQL init process failed.

sqlファイルやinit用のファイル群

作成に際して, 以下の記事を参考にしました。

フォルダ構成は以下の通りです。

.
├── docker
│   └── db
│       ├── data
│       ├── my.cnf
│       └── sql
│           ├── create-user-table.sql
│           └── init-database.sh
├── docker-compose.yml
└── init-mysql.sh

./docker/db/my.cnf

// ./docker/db/my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4
port = 3306
user = docker
password = docker

./docker/db/sql/create-user-table.sql

-- User Table
drop table if exists `User`;

create table if not exists `User`
(
  `id`             INT(8) AUTO_INCREMENT,
  `name`           VARCHAR(64) NOT NULL,
  `hashed_pass`    VARCHAR(64) NOT NULL,
  primary key(`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

./docker/db/sql/init-database.sh

#!/usr/bin/env bash
#sleep 90s

#run the setup script to create the DB and the schema in the DB
mysql --defaults-extra-file=/etc/mysql/my.cnf sampleDB < "/docker-entrypoint-initdb.d/create-user-table.sql"

./init-mysql.sh

#!/bin/sh
docker-compose exec db bash -c "chmod 0775 docker-entrypoint-initdb.d/init-database.sh"
docker-compose exec db basg -c "./docker-entrypoint-initdb.d/init-database.sh"

実行環境

  • macOS Mojave version 10.14.1
  • docker-compose version 1.23.2, build 1110ad01
  • Docker version 18.09.2, build 6247962
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • otolab

    2019/06/09 22:52

    > docker-compose exec db basg -c "./docker-entrypoint-initdb.d/init-database.sh"

    basgはどの段階でのtypoですか?(basgはあんまり聞いたことない)

    キャンセル

回答 3

checkベストアンサー

+1

ログからdocker-entry-point.shのこの部分がうまくいっていないのがわかります。

        mysql=( mysql --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" )

        for i in {30..0}; do
            if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then
                break
            fi
            echo 'MySQL init process in progress...'
            sleep 1
        done
        if [ "$i" = 0 ]; then
            echo >&2 'MySQL init process failed.'
            exit 1
        fi

mysqldが起動するのを待つためにmysqlコマンドで接続してSELECT 1が成功するか1秒おきに確かめるだけの簡単な処理ですがこれがうまくいかず、結局リトライ回数の上限に達してエラー終了しています。

これは何故かというと、./docker/db/my.cnfの中で指定したパスワードがこのときに使われてしまい、うまく接続できなくなるためと思われます。実際、該当行(password = docker)をコメントアウトすればここの部分のエラーはでなくなります。

ただし、./docker/db/sql/init-database.shで実行するmysqlコマンドが./docker/db/my.cnfでパスワードが設定されていることを前提としているので、別の方法でパスワードを与える必要があります。(設定ファイルを別の場所に作ってそちらを指定する等)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/16 11:28

    ありがとうございました!
    BAするのを忘れていました。申し訳ないです。

    以下に同様のIssueが立っていたようです。
    https://github.com/docker-library/mysql/issues/490

    キャンセル

0

https://hub.docker.com/_/mysql
ここを見ると

   command: --default-authentication-plugin=mysql_native_password

という書き方になっているので、 command はmysqldから初めてはいけないような気がします。

あとは..localhostからの接続を受け付けていないという可能性があると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/09 14:37 編集

    ご指摘ありがとうございます。

    docker-compose.ymlを以下の様に修正しましたが, 結果は変わりませんでした。

    ```yaml
    // docker-compose.yml
    // ~~略~~

    - command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    + command: --default-authentication-plugin=mysql_native_password
    ```

    キャンセル

0

まだDBの中が空っぽで消しても大丈夫でしたら./docker/db/dataのなかを全部消してやり直してみてはどうでしょうか。

環境変数をセットする前に起動したコンテナの設定が残っている場合があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/09 10:44

    ありがとうございます。
    `./docker/db/data`以下を空にしてもう一度`docker-compose up -d`をしましたが, 結果は同じでした。

    キャンセル

  • 2019/06/09 13:42

    あとは、
    docker-compose logs db
    で、どんなエラーが出ているかを確認してみれば、何かわかるかもしれません。

    キャンセル

  • 2019/06/09 14:42

    アドバイスありがとうございます。
    docker-compose logs dbの結果を質問文に追記しました。

    ログの3行目で「rootがempty passwordになってるよ」と言われているので, やはりdocker-compose.ymlの内容が正しく反映されていない様です......

    ともすれば, entrypoint.shが正しく実行されていない可能性もありそうです......
    記載していなかったsqlファイルやinitialize用のファイルも追記するので, もしよければ参考にしてください。
    よろしくお願いします。

    キャンセル

  • 2019/06/09 23:10

    docker-entrypoint.shをみると--initialize-insecureで、rootのパスワードの設定なしで初期化したあと、MYSQL_ROOT_PASSWORDのパスワードを設定するという動作なので、そこのワーニング表示は異常ではないです。
    初期化後に、走るはずのパスワード設定や、ユーザ追加のところまで行かずにinit process failedになってしまっています。
    環境変数が原因ではなさそうですが、私にはこれ以上はわかりません。
    うーん、試すなら、コンテナのバージョン変えてみるとか、できるだけ生に近いコンテナの設定で起動させてみて、そこから少しづつ変更入れながら原因探るとか。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる