Docker mysql 設定変更

mysqlのdockerコンテナでmysqlの設定変更をするときちょっとはまったのでメモ

mysqlのdockerコンテナ(設定変更前)

docker-compose.yml

# ------------------------------------------
# mysql
# ------------------------------------------
mysql:
build: ./mysql-db
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3306:3306"
volumes_from:
- mysql-data
container_name: mysql-db
restart: always

# ------------------------------------------
# mysql データ
# ------------------------------------------
mysql-data:
image: busybox
volumes:
- ./mysql-data:/var/lib/mysql
container_name: mysql-data

やりたいこと

  • デフォルトタイムゾーンを東京にする
  • 大きなデータを送る上限が4MBになっているので32MBにする

設定の変更について

コンテナの「/etc/mysql/conf.d/」にcnfファイルを追加すれば、mysql起動時に設定を読み込んでくれて設定が変更できる

コンテナ内を確認

docker exec -it mysql-db /bin/bash

cnfファイル追加前は、docker.cnf、mysql.cnfがあった。

$ ls -l /etc/mysql/conf.d/
-rw-r--r-- 1 root root 43 Feb 28 06:56 docker.cnf
-rw-r--r-- 1 root root 875 Nov 28 19:25 mysql.cnf

まずてきとうにmysqld.cnfというファイルを作成

docker-compose.ymlのある場所にconf.dというディレクトを作成して、mysqld.cnfを作成する
mysqld.cnf

[mysqld]
max_allowed_packet = 32M
default-time-zone = 'Asia/Tokyo'

docker-compose.ymlを修正してみる

# ------------------------------------------
# mysql
# ------------------------------------------
mysql:
build: ./mysql-db
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3306:3306"
volumes:
- ./conf.d:/etc/mysql/conf.d  ★dockerホストをマウントして、ファイルを置いておけばいける?
volumes_from:
- mysql-data
container_name: mysql-db
restart: always

コンテナ内を確認

docker exec -it mysql-db /bin/bash

もともとあったdocker.cnf、mysql.cnfがなくなり、新しく作成したmysqld.cnfはあった。

コンテナ内でmysqlの設定確認

mysql -p -e "show variables like '%max_allowed_packet%';"
mysql: [Warning] World-writable config file '/etc/mysql/conf.d/mysqld.cnf' is ignored.

設定が反映されていない。しかも権限のエラーが出てる。権限が777になっていて、権限を弱めてあげる必要があるみたいだ。

volumesで権限ってどうやって変更する???

volumesを使ってdockerホストをマウントして権限も変更する方法がよくわからない。DockerfileでADDしてcnfファイルを追加してやることにする

Dockerfile

# base images
FROM mysql:5.7

# author
MAINTAINER hoge

# カスタムのcnfファイルを追加
ADD mysqld.cnf /etc/mysql/conf.d/
# 権限の変更
RUN chmod 644 /etc/mysql/conf.d/mysqld.cnf

docker-compose.yml

# ------------------------------------------
# mysql
# ------------------------------------------
mysql:
build: ./mysql-db ★Dockerfileの場所
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3306:3306"
volumes_from:
- mysql-data
container_name: mysql-db
restart: always

確認

$ docker exec -it mysql-db /bin/bash
root@a8a0e6e35a32:/# mysql -p -e "show variables like '%max_allowed_packet%';"
Enter password:
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| max_allowed_packet | 33554432 |
| slave_max_allowed_packet | 1073741824 |
+--------------------------+------------+
root@a8a0e6e35a32:/# mysql -p -e "show variables like '%time_zone%';"
Enter password:
+------------------+------------+
| Variable_name | Value |
+------------------+------------+
| system_time_zone | UTC |
| time_zone | Asia/Tokyo |
+------------------+------------+

まとめ

mysqlの設定変更はできたが、Dockerfileの作成をあまりしたことないので、これでいいのか不明。
docker-compose.ymlとDockerfileについてまだまだ不勉強すぎる