matobaの備忘録

和歌山と東京を往復しつつ活動するエンジニアの記録

docker-composeでMySQLの起動を待つ

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で以下のスレにたどり着いた。

stackoverflow.com

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"]