日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

travis上でdockerのmysqlを使ったらCan't connect to MySQL serverと言われてハマった

travisでdocker container上のmysqlに接続しようとしたらなぜか接続できずハマりました。
最終的な原因は $HOME/.my.cnf に設定が上書きされてたのという点でした。
検証用にちょろっと書いたレポジトリはこちら

github.com

travis上でdocker containerを立ち上げて、--defaults-extra-fileのオプションで設定ファイルを読み込み接続しようとしました。
ローカルでやるとこんな感じです。

$docker run --detach --env MYSQL_ROOT_PASSWORD=root --publish 3307:3306 mysql:5.6
bcd7e3220a8efdf52198ab7f03cf2990ce4e00da2e25e417fe5a2f4e24c8f11c

$cat mysql.conf
[client]
user=root
password=root
host=127.0.0.1
port=3307

$mysql --defaults-extra-file=mysql.conf -e 'SELECT 1'
+---+
| 1 |
+---+
| 1 |
+---+

接続余裕ですね。
しかし、同じようなことをtravis上でやると失敗しました。

https://travis-ci.org/ara-ta3/travis-docker-mysql-sample/jobs/350786275

$ docker run --detach --env MYSQL_ROOT_PASSWORD=root --publish 3307:3306 mysql:5.6
Unable to find image 'mysql:5.6' locally
5.6: Pulling from library/mysql
Status: Downloaded newer image for mysql:5.6
6cbf40ed94765b27eaafe2fb6f00be11e0a00265bd30ac125eeab2cbbb071c22

$ sleep 10

$ sudo service mysql stop
mysql stop/waiting
$ mysql --defaults-extra-file=mysql.conf -e 'SELECT 1;'
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

原因はmy.cnfの読み込みの順序でした。
--helpやら色々やっていくと読み込まれている設定ファイルの順序が出ていました。

$ mysql --defaults-extra-file=mysql.conf --help
mysql  Ver 14.14 Distrib 5.6.33, for debian-linux-gnu (x86_64) using  EditLine wrapper
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

...

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf /home/travis/build/ara-ta3/travis-docker-mysql-sample/mysql.conf ~/.my.cnf 
The following groups are read: mysql client

なるほど、--defaults-extra-fileで指定されたファイルの後に ~/.my.cnfが読まれるんですね!!! 😇
~/.my.cnfにしっかり[client]の設定が書かれていました。
--print-defaultsというオプションを指定してみたら先になんかport指定されてるぞ・・・?というところから気が付きました。
--print-defaults便利だったので、なんか設定が変だなとなったときは使っていきたいですね。

$ cat ~/.my.cnf
# Managed by Chef for packer-5a26f3f3-4b65-3c91-579b-7cc9c3fb2e7f.c.eco-emissary-99515.internal :heart_eyes_cat:
[client]
default-character-set = utf8
port = 3306
user = root
password =
socket = /var/run/mysqld/mysqld.sock
[mysql]
default-character-set = utf8

$ mysql --defaults-extra-file=mysql.conf --print-defaults
mysql would have been started with the following arguments:
--port=3306 --socket=/var/run/mysqld/mysqld.sock --user=root --password=root --host=127.0.0.1 --port=3307 --default-character-set=utf8 --port=3306 --user=root --password= --socket=/var/run/mysqld/mysqld.sock --default-character-set=utf8 

これがベストかは置いといてrm ~/.my.cnfしたらとりあえず動きました。
動いたサンプルのビルドはこちらです。

https://travis-ci.org/ara-ta3/travis-docker-mysql-sample/builds/350787431