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

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

新規登録して質問してみよう
ただいま回答率
85.42%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

3回答

7329閲覧

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

task4233

総合スコア106

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2019/06/08 14:05

編集2019/06/09 06:17

質問・実現したいこと

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

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

  • MYSQL_ROOT_PASSWORD
  • MYSQL_USER
  • MYSQL_PASSWORD

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

yml:docker

1# docker-compose.yml 2version: '3' 3 4services: 5 # MySQL 6 db: 7 image: mysql:8.0 8 container_name: mysql_host 9 environment: 10 MYSQL_ROOT_PASSWORD: root # rootのpassをrootに設定 11 MYSQL_DATABASE: sampleDB 12 MYSQL_USER: docker # dockerというユーザを定義 13 MYSQL_PASSWORD: docker # そのユーザのpassをdockerに設定 14 TZ: 'Asia/Tokyo' 15 command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 16 volumes: 17 - ./docker/db/data:/var/lib/mysql 18 - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf 19 - ./docker/db/sql:/docker-entrypoint-initdb.d 20 ports: 21 - 3306:3306

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

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

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

bash

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

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

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

追記

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

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

bash

1$ docker ps 2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 302a3b0b8f72d 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 4$ docker exec -it 02a /bin/bash 5root@02a3b0b8f72d:/# env 6MYSQL_PASSWORD=docker 7TZ=Asia/Tokyo 8HOSTNAME=02a3b0b8f72d 9MYSQL_DATABASE=sampleDB 10MYSQL_ROOT_PASSWORD=root 11PWD=/ 12HOME=/root 13MYSQL_MAJOR=8.0 14GOSU_VERSION=1.7 15MYSQL_USER=docker 16MYSQL_VERSION=8.0.16-2debian9 17TERM=xterm 18SHLVL=1 19PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 20_=/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で設定したはずだからです。
何故なのか...

text

1Attaching to mysql_host 2mysql_host | Initializing database 3mysql_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. 4mysql_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 5mysql_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. 6mysql_host | 2019-06-09T05:25:30.689081Z 0 [System] [MY-013170] [Server] /usr/sbin/mysqld (mysqld 8.0.16) initializing of server has completed 7mysql_host | Database initialized 8mysql_host | MySQL init process in progress... 9mysql_host | MySQL init process in progress... 10mysql_host | MySQL init process in progress... 11mysql_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. 12mysql_host | 2019-06-09T05:25:34.006555Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.16) starting as process 79 13mysql_host | 2019-06-09T05:25:36.482160Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 14mysql_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. 15mysql_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. 16mysql_host | 2019-06-09T05:25:36.843695Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' 17mysql_host | MySQL init process in progress... 18mysql_host | MySQL init process in progress... 19mysql_host | MySQL init process in progress... 20mysql_host | MySQL init process in progress... 21mysql_host | MySQL init process in progress... 22mysql_host | MySQL init process in progress... 23mysql_host | MySQL init process in progress... 24mysql_host | MySQL init process in progress... 25mysql_host | MySQL init process in progress... 26mysql_host | MySQL init process in progress... 27mysql_host | MySQL init process in progress... 28mysql_host | MySQL init process in progress... 29mysql_host | MySQL init process in progress... 30mysql_host | MySQL init process in progress... 31mysql_host | MySQL init process in progress... 32mysql_host | MySQL init process in progress... 33mysql_host | MySQL init process in progress... 34mysql_host | MySQL init process in progress... 35mysql_host | MySQL init process in progress... 36mysql_host | MySQL init process in progress... 37mysql_host | MySQL init process in progress... 38mysql_host | MySQL init process in progress... 39mysql_host | MySQL init process in progress... 40mysql_host | MySQL init process in progress... 41mysql_host | MySQL init process in progress... 42mysql_host | MySQL init process in progress... 43mysql_host | MySQL init process in progress... 44mysql_host | MySQL init process in progress... 45mysql_host | MySQL init process failed.

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

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

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

bash

1. 2├── docker 3│   └── db 4│  ├── data 5│ ├── my.cnf 6│ └── sql 7│ ├── create-user-table.sql 8│ └── init-database.sh 9├── docker-compose.yml 10└── 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

sql

1-- User Table 2drop table if exists `User`; 3 4create table if not exists `User` 5( 6 `id` INT(8) AUTO_INCREMENT, 7 `name` VARCHAR(64) NOT NULL, 8 `hashed_pass` VARCHAR(64) NOT NULL, 9 primary key(`id`) 10) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

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

sh

1#!/usr/bin/env bash 2#sleep 90s 3 4#run the setup script to create the DB and the schema in the DB 5mysql --defaults-extra-file=/etc/mysql/my.cnf sampleDB < "/docker-entrypoint-initdb.d/create-user-table.sql"

./init-mysql.sh

sh

1#!/bin/sh 2docker-compose exec db bash -c "chmod 0775 docker-entrypoint-initdb.d/init-database.sh" 3docker-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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otolab

2019/06/09 13:52

> docker-compose exec db basg -c "./docker-entrypoint-initdb.d/init-database.sh" basgはどの段階でのtypoですか?(basgはあんまり聞いたことない)
guest

回答3

0

ベストアンサー

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

bash

1 mysql=( mysql --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" ) 2 3 for i in {30..0}; do 4 if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then 5 break 6 fi 7 echo 'MySQL init process in progress...' 8 sleep 1 9 done 10 if [ "$i" = 0 ]; then 11 echo >&2 'MySQL init process failed.' 12 exit 1 13 fi

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

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

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

投稿2019/06/17 01:06

crhg

総合スコア1177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

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

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

投稿2019/06/09 01:02

bsdfan

総合スコア4659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

task4233

2019/06/09 01:44

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

2019/06/09 04:42

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

2019/06/09 05:42

アドバイスありがとうございます。 docker-compose logs dbの結果を質問文に追記しました。 ログの3行目で「rootがempty passwordになってるよ」と言われているので, やはりdocker-compose.ymlの内容が正しく反映されていない様です...... ともすれば, entrypoint.shが正しく実行されていない可能性もありそうです...... 記載していなかったsqlファイルやinitialize用のファイルも追記するので, もしよければ参考にしてください。 よろしくお願いします。
bsdfan

2019/06/09 14:10

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

0

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

command: --default-authentication-plugin=mysql_native_password

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

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

投稿2019/06/08 19:44

otolab

総合スコア767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

task4233

2019/06/09 05:38 編集

ご指摘ありがとうございます。 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 ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問