背景
- jwilder/dockerize: Utility to simplify running applications in docker containers
- ufoscout/docker-compose-wait: A simple script to wait for other docker images to be started while using docker-compose
この辺は全部試したが, PHP から接続しようとすると Connection Refused
が多発する。TCP で接続可能になってから実際に利用可能になるまで若干のラグがあるため,もっと確実な方法を探していた。
対処法
とりあえずこれを書いておけ
sh -c 'docker-compose logs -f <MySQLコンテナ名> | { sed "/\[Entrypoint\]: MySQL init process done\. Ready for start up\./ q" && kill $$ ;}' >/dev/null 2>&1 || :
YAMLのリストに書く場合はエスケープが必要なのでパイプから改行する
- |
sh -c 'docker-compose logs -f <MySQLコンテナ名> | { sed "/\[Entrypoint\]: MySQL init process done\. Ready for start up\./ q" && kill $$ ;}' >/dev/null 2>&1 || :
ログを見れば確実!ログに MySQL init process done
と出ればアプリケーションレベルでも必ず有効な状態であることが保証される。
おまけ
php-fpm 版
sh -c 'docker-compose logs -f <FPMコンテナ名> | { sed "/NOTICE: ready to handle connections/ q" && kill $$ ;}' >/dev/null 2>&1 || :
あわせ技(その1)
sh -c 'docker-compose logs -f <MySQLコンテナ名> | { sed "/\[Entrypoint\]: MySQL init process done\. Ready for start up\./ q" && kill $$ ;}' >/dev/null 2>&1 &
sh -c 'docker-compose logs -f <FPMコンテナ名> | { sed "/NOTICE: ready to handle connections/ q" && kill $$ ;}' >/dev/null 2>&1 &
wait
引数なし wait
で一気に終了を待つ場合は終了ステータスが不問になるため, || :
は不要です。
あわせ技(その2)
{
sh -c 'docker-compose logs -f <MySQLコンテナ名> | { sed "/\[Entrypoint\]: MySQL init process done\. Ready for start up\./ q" && kill $$ ;}' &
sh -c 'docker-compose logs -f <FPMコンテナ名> | { sed "/NOTICE: ready to handle connections/ q" && kill $$ ;}' &
wait
} >/dev/null 2>&1
リダイレクトをまとめて見やすく。