docker-composeでMySQLコンテナと、MySQLのDBを利用するアプリケーションがある時、DBを利用するアプリは、MySQLコンテナの起動を待ちたい。
docker-composeの depends_on で以下のように指定したもアプリのコンテナが起動しはじめるの早すぎて、接続エラーが出ていた。
version: '3' services: web: ... 略 depends_on: - db db: image: mysql:5.7 ... 略
少し調べると、depends_onにはShort SyntaxとLong Syntaxがあるらしい。
参考 : Docker Compose の depends_on の使い方まとめ | gotohayato.com
なので、Long Syntaxを利用して以下のように書いてみる。
version: '3' services: web: ... 略 depends_on: db: condition: service_healthy db: image: mysql:5.7 ... 略
するとdocker-compose upしたタイミングで次のエラーが出た。
container for service "db" has no healthcheck configured
どうやらどうやってhealthcheckするかの設定は自分で書く必要があるらしい。
良い設定を探したところ、stackoverflowで以下のスレにたどり着いた。
mysqladmin pingを実行してヘルスチェックにする方法が紹介されていたので、以下のように記載した。
version: '3' services: web: ... 略 depends_on: db: condition: service_healthy db: image: mysql:5.7 ... 略 healthcheck: test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] timeout: 20s retries: 10
これで、うまくMySQLの起動を待てるようになった。
ヘルスチェック時に、以下の警告が出るので、コマンドを微調整しておく。
Access denied for user ‘root’@’localhost’
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "mysql", "-pmysql"]