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