概要
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
初期化を待つ
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
」という風にしている。