- docker 公式の MySQL イメージで MYSQL_DATABASE を使った場合の挙動について調べる
- docker の MySQL イメージには docker 製と MySQL 製があるので少し注意
MYSQL_DATABASE
This variable is optional and allows you to specify the name of a database to be created on image startup. If a user/password was supplied (see below) then that user will be granted superuser access (corresponding to GRANT ALL) to this database.
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker version
Client:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built: Wed Oct 26 21:39:14 2016
OS/Arch: linux/amd64
Server:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built: Wed Oct 26 21:39:14 2016
OS/Arch: linux/amd64
- docker-compose の stop -> start ではコンテナの生成はされない
環境変数 MYSQL_DATABASE を設定せずに一度起動してそのまま停止
[mapk0y@kona:~/tmp/docker/mysql]$ cat docker-compose.yml
version: '2'
services:
mysql:
image: mysql
environment:
# MYSQL_DATABASE: "newdb"
MYSQL_ROOT_PASSWORD: "rootpass"
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose up -d
Creating network "mysql_default" with the default driver
Creating mysql_mysql_1
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose exec mysql mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose stop
Stopping mysql_mysql_1 ... done
環境変数の修正
[mapk0y@kona:~/tmp/docker/mysql]$ cp docker-compose{,.bak}.yml
[mapk0y@kona:~/tmp/docker/mysql]$ vi docker-compose.yml
[mapk0y@kona:~/tmp/docker/mysql]$ diff -U1 docker-compose.*
--- docker-compose.bak.yml 2016-11-03 18:25:20.480122926 +0900
+++ docker-compose.yml 2016-11-03 18:26:26.616120180 +0900
@@ -6,3 +6,3 @@
environment:
-# MYSQL_DATABASE: "newdb"
+ MYSQL_DATABASE: "newdb"
MYSQL_ROOT_PASSWORD: "rootpass"
この状態で再度コンテナを起動(初回は creating~ となっていたのが、Recreating になっている)
[mapk0y@kona:~/tmp/docker/mysql]$ cat docker-compose.yml
version: '2'
services:
mysql:
image: mysql
environment:
MYSQL_DATABASE: "newdb"
MYSQL_ROOT_PASSWORD: "rootpass"
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose up -d
Recreating mysql_mysql_1
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose exec mysql mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose exec mysql env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=ac2bcd3a6b4d
MYSQL_ROOT_PASSWORD=rootpass
affinity:container==a39b0c9589a2396ffddd1cc994ae73078cc98048ca9a3d1b6cdce91a88c79861
MYSQL_DATABASE=newdb
GOSU_VERSION=1.7
MYSQL_MAJOR=5.7
MYSQL_VERSION=5.7.16-1debian8
HOME=/root
環境変数 MYSQL_DATABASE はきちんと渡されているが、newdb は作成されていない事がわかる。
- volume 有り無しでの挙動確認
[mapk0y@kona:~/tmp/docker/mysql]$ cat docker-compose.yml
version: '2'
services:
mysql:
image: mysql
environment:
MYSQL_DATABASE: "newdb"
MYSQL_ROOT_PASSWORD: "rootpass"
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose up -d
Creating network "mysql_default" with the default driver
Creating mysql_mysql_1
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose exec mysql mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| newdb |
| performance_schema |
| sys |
+--------------------+
- volumes を設定する
- volumes の対象はホストの
./data
ディレクトリとする
[mapk0y@kona:~/tmp/docker/mysqlv]$ ls -l
total 4
-rw-r--r-- 1 mapk0y mapk0y 211 11月 3 18:05 docker-compose.yml
[mapk0y@kona:~/tmp/docker/mysqlv]$ cat docker-compose.yml
version: '2'
services:
mysqlv:
image: mysql
environment:
MYSQL_DATABASE: "newdb"
MYSQL_ROOT_PASSWORD: "rootpass"
volumes:
- ./data:/var/lib/mysql
[mapk0y@kona:~/tmp/docker/mysqlv]$ ls -l
total 4
-rw-r--r-- 1 mapk0y mapk0y 211 11月 3 18:05 docker-compose.yml
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose up -d
Creating network "mysqlv_default" with the default driver
Creating mysqlv_mysqlv_1
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose exec mysqlv mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| newdb |
| performance_schema |
| sys |
+--------------------+
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose stop
Stopping mysqlv_mysqlv_1 ... done
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose down
Removing mysqlv_mysqlv_1 ... done
Removing network mysqlv_default
- volumes を設定する
- volumes の対象はホストの
./data
ディレクトリとする - 1回目は MYSQL_DATABASE の設定無しで起動する
- その後、一度停止及びコンテナの削除を実施して(データは消えない)MYSQL_DATABASE の設定を追加して起動する。
1回目のコンテナ作成(MySQL の初期設定)
[mapk0y@kona:~/tmp/docker/mysqlv]$ ls -l
total 4
-rw-r--r-- 1 mapk0y mapk0y 211 11月 3 18:05 docker-compose.yml
[mapk0y@kona:~/tmp/docker/mysqlv]$ cat docker-compose.yml
version: '2'
services:
mysqlv:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: "rootpass"
volumes:
- ./data:/var/lib/mysql
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose up -d
Creating network "mysqlv_default" with the default driver
Creating mysqlv_mysqlv_1
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose exec mysqlv mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose exec mysqlv mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
この時点では、当然 newdb は作成されていない
コンテナの停止、削除
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose down
Stopping mysqlv_mysqlv_1 ... done
Removing mysqlv_mysqlv_1 ... done
Removing network mysqlv_default
ディレクトリの確認
[mapk0y@kona:~/tmp/docker/mysqlv]$ ls -l
total 8
drwxr-xr-x 5 999 docker 4096 11月 3 18:10 data/
-rw-r--r-- 1 mapk0y mapk0y 175 11月 3 18:09 docker-compose.yml
環境変数の修正
[mapk0y@kona:~/tmp/docker/mysqlv]$ cp docker-compose{,.bak}.yml
[mapk0y@kona:~/tmp/docker/mysqlv]$ vi docker-compose.yml
[mapk0y@kona:~/tmp/docker/mysqlv]$ diff -U1 docker-compose.*
--- docker-compose.bak.yml 2016-11-03 18:12:23.424155184 +0900
+++ docker-compose.yml 2016-11-03 18:12:54.196153906 +0900
@@ -6,2 +6,3 @@
environment:
+ MYSQL_DATABASE: "newdb"
MYSQL_ROOT_PASSWORD: "rootpass"
コンテナの起動
[mapk0y@kona:~/tmp/docker/mysqlv]$ cat docker-compose.yml
version: '2'
services:
mysqlv:
image: mysql
environment:
MYSQL_DATABASE: "newdb"
MYSQL_ROOT_PASSWORD: "rootpass"
volumes:
- ./data:/var/lib/mysql
[mapk0y@kona:~/tmp/docker/mysqlv]$ ls -l
total 12
drwxr-xr-x 5 999 docker 4096 11月 3 18:10 data/
-rw-r--r-- 1 mapk0y mapk0y 175 11月 3 18:12 docker-compose.bak.yml
-rw-r--r-- 1 mapk0y mapk0y 211 11月 3 18:12 docker-compose.yml
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose up -d
Creating network "mysqlv_default" with the default driver
Creating mysqlv_mysqlv_1
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose exec mysqlv mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
利用されている起動スクリプトでは、/var/lib/mysql/mysql/
があるかどうかで初期設定を行うかどうか判断しているため