自社サービスや受託開発で利用する Docker イメージを見直しています。MySQL 用のイメージや Rails 用イメージを見直したところ, CircleCI 上でテストを実行する際に MySQL に接続できずテストが落ちる現象が発生しました。
テストが落ちた原因
MySQL の ENTRYPOINT
の処理を見直した結果, MySQL が起動する前にデータベースへ接続しようとし, 結果接続できず落ちる状態でした。
変更前の ENTRYPOINT
では最低限の処理だけ行い, その他の設定処理は起動後に外側から command
を使って実行していました。見直しによって ENTRYPOINT
側で対応する処理を増やしたため初期化に時間がかかるようになってしまった模様。
対応
とりあえずの対応として, MySQL の初期化が完了するまでの時間として SLEEP 10
をとりあえず追加しました。(よくない)
Dockerize
本来であれば Dockerize を用いるのが良さそうです。
- [Configuring Databases - CircleCI](https://circleci.com/docs/2.0/databases/# using-dockerize-to-wait-for-dependencies)
- [Database Configuration Examples - CircleCI](https://circleci.com/docs/2.0/postgres-config/# example-ruby-project-with-mysql-and-dockerize)
複数のコンテナを組み合わせて利用する場合は dockerize をイメージに含めておくと良さそうです。CircleCI が提供しているイメージにはインストールされているらしい。
[Using Custom-Built Docker Images](https://circleci.com/docs/2.0/custom-images/# required-tools-for-primary-containers) のリストにはなかったので見逃していました。一緒に書いておいて欲しかった。
今回に限っては SLEEP 10
でお茶を濁して, 次回以降の見直し時に対応しようと思います。