読者です 読者をやめる 読者になる 読者になる

rakugakibox.net

技術ノート。兼JS/CSS実験場。 ♡:Java, Spring, AWS.

CircleCI: Docker で MySQL の好きなバージョンを動かす

CircleCIに入ってるMySQLは5.5です。古いです。

この記事では、CircleCIのDockerを使って、
MySQL 5.6, 5.7 を動かしてみました。

circle.yml

machine.services でDockerを使えるようにします。

machine:
  services:
    - "docker"

dependencies あたりでMySQLを起動します。

dependencies:
  override:
    - docker run --detach --publish {port}:3306 --env MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:{version}
    - mysqladmin --host=127.0.0.1 --port={port} --user=root --wait ping
  • {version} の部分には、使うバージョンのタグ (5.6, 5.7.11, latest 等) を指定します。
    • タグは mysql - Docker Hub から確認できました。
    • マイナーバージョンまで細かく指定出来て良いです。
  • {port} の部分には、接続するときのポート番号を指定します。
    • CircleCIでは既にMySQLが動いてるので、 3306 は使えませんでした。
  • MYSQL_ALLOW_EMPTY_PASSWORD=yes でrootパスワードはなしにしてます。
    • 必要なら MYSQL_ROOT_PASSWORD, MYSQL_USER, MYSQL_PASSWORD 等を使うと良さそう。
  • mysqladmin ping が通るまで待機してます。
    • docker run だけだと即座に接続できないことがあったので。
    • --wait オプションで失敗してもリトライしてくれるようです。
  • --hostlocalhost ではなくIPアドレス (127.0.0.1) を使ってます。
    • localhost だとソケット接続になってしまうようです。
    • --protocol=tcp オプションを使っても良いかも。

あとは後続処理で自分用のDBやテーブルを作るなりテストするなり。
もしmysqlコマンドで繋ぐなら、こんな感じで接続できました。

test:
  override:
    - mysql --host=127.0.0.1 --port={port} --user=root --execute "select host, user from mysql.user"

Docker 使わない版

以前こんな記事も書きました。

この記事では、既存の 5.5 をアンインストールしてから、
localhsotに 好みのバージョンをインストールするようにしてました。

これだと CircleCI の既存の状態を意識しないといけなかったり、
5.7 にしようとしたら既存データのアップグレード等が発生したりで面倒でした...

今回のDockerなら、タグを書き換えるだけなので楽ちんです。

コード

実際に CircleCI で回したコードと結果です。
5.6, 5.7 の2つを起動して、それぞれのバージョン, DB, ユーザを出力しました。