MySQL コンテナの起動を待つ #mysql #docker

概要

Docker で MySQL コンテナの起動を待つ方法まとめ

nc で待つ

nc コマンドで待つ。

CircleCI の Example にあった。

for i in `seq 1 10`;
do
  nc -z 127.0.0.1 3306 && echo Success && exit 0
  echo -n .
  sleep 1
done
echo Failed waiting for MySQL && exit 1

dockerize で待つ

これも CircleCI の doc で知った。

-wait を使うことで、起動を監視できる。

CircleCI の公式イメージだと大体インストールされている気がする。

dockerize -wait tcp://localhost:3306 -timeout 1m

github.com

初期化を待つ

nc や dockerize だと、起動の確認までしかできない。

起動時のデータ投入などで初期化中の場合、エラーになってしまうので別途待機する必要がある。

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 102

初期化エラーの場合、mysql クライアントに上記のようなエラーが帰ってくるのでそれを grep することで判定してみた。

for i in $(seq 1 10);
do
  (mysql -h 127.0.0.1 -P 3306 2>&1 1>/dev/null | grep "ERROR 2013 (HY000)" 1>/dev/null) \
    && : || exit 0
  echo -n .
  sleep 1
done
echo ""

2>&1 1>/dev/null

コマンド結果のエラー出力をパイプでつなげるために標準出力にリダイレクトしている。

標準出力自体は捨ててる。

&& : || exit 0

A && B || C とすることで三項演算子っぽくしている。

: は何もせずに終了ステータス0を返す。

「エラーが初期化エラーだったら何もしない」「エラーが初期化エラー意外であれば exit 0 」という風にしている。

参考