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

DockerToolbox でローカル開発環境構築 1 docker-composeの環境変数

windows10 home 上でdockerを使いローカル開発環境を作ろうとしていろいろはまった。homeなのでDocker for Windows(Hyper-Vを使うやつ)は使えないので、Docker Toolbox のwindows版を使うことにした。cenosをdockerホストにして少しだけdockerの勉強はしていたが、windowsだとなにかと問題があったりする。

Docker Toolbox

  • https://docs.docker.com/toolbox/overview/

 

webサーバー立てる

まずは、nginxでwebサーバーを構築しようとdocker-composeを使いdocker-compose.ymlを作成

 

docker-compose.yml

nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
privileged: true
ports:
- 80:80
- 443:443
volumes:
- ./docker-compose.d/certs:/etc/nginx/certs:ro
- ./docker-compose.d/htpasswd:/etc/nginx/htpasswd
- /etc/nginx/vhost.d
- /usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: always

docker-compose up -d を実行すると下記のエラー

ERROR: for nginx-proxy Cannot create container for service nginx-proxy: invalid bind mount spec "C:\\Users\\hoge\\docker\\docker-compose.d\\htpasswd:/etc/nginx/htpasswd:rw": invalid volume specification: 'C:\Users\hoge\docker\docker-compose.d\htpasswd:/etc/nginx/htpasswd:rw'
ERROR: Encountered errors while bringing up the project.

google翻訳すると
* 無効なバインドマウント仕様
* 無効なボリューム指定
いやいやDocker Toolboxのdocker-machineでは、winのローカルのC:\Userと
docker-machine(VirtualBox)の/c/Userがファイル共有されマウント済みであるはず

絶対パスで指定してみる

volumes:
- /c/Users/hoge/docker/docker-compose.d/certs:/etc/nginx/certs:ro
- /c/Users/hoge/docker/docker-compose.d/htpasswd:/etc/nginx/htpasswd
- /etc/nginx/vhost.d
- /usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro

ERROR: for nginx-proxy Cannot create container for service nginx-proxy: create \c\Users\hoge\docker\docker-compose.d\htpasswd: "\\c\\Users\\hoge\\docker\\docker-compose.d\\htpasswd" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intented to pass a host directory, use absolute path
ERROR: Encountered errors while bringing up the project.

google翻訳すると
* ローカルボリューム名に無効な文字が含まれています

 

いろいろ検索して調査

https://github.com/docker/compose/blob/master/CHANGELOG.md#190-2016-11-16

1.9.0 (2016-11-16)

  • Breaking changes
WindowsでDocker Toolbox / Machineを使用して作成する場合、デフォルトでボリュームパスはC:\ Usersから/ c / Users-styleに変換されなくなりました。 この変換を再度有効にしてボリュームが機能し続けるようにするには、環境変数COMPOSE_CONVERT_WINDOWS_PATHS = 1を設定します。 Docker for Windowsのユーザーは影響を受けず、変数を設定する必要はありません。

とのことです。

環境変数を設定


変数名(N): COMPOSE_CONVERT_WINDOWS_PATHS 変数値(V): 1

これで、絶対パスでなくても起動できた。docker-machineに問題あると調査していてはまった。
まさかdocker-composeの問題とは