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についてまだまだ不勉強すぎる