docker-compose.yml でビルドする場合、下記のような形で「depends_on」を記載しコンテナの立ち上げ順序を制御します。
基本的に下記で問題はないのですが、一部の環境で問題が発生することがあります。
調べるといろいろな記事が見つかると思いますが、「コンテナの起動順序」と「コンテナ内のサービスの起動順序」は一致しない ということです。
docker-compose.yml
version: '3.7'
services:
app:
build:
context: .
dockerfile: app.Dockerfile
container_name: app
privileged: true
ports:
- 80:80
- 443:443
depends_on:
- db
db:
build:
context: .
# 公式のMySQLイメージを記載しています
dockerfile: db.Dockerfile
container_name: db
ports:
- 3306:3306
上記の記述で「データベース」のコンテナが立ち上げた後に「アプリケーション」のコンテナが起動します。
上記はコンテナの起動順序の話であり、データベースコンテナ内のMySQLサービスが起動してからアプリケーションコンテナが立ち上がることを保証しているわけではありません。
ですので、アプリケーションコンテナ起動時にデータベース接続がある場合は正常にアプリケーションコンテナが立ち上がらない場合があります。
アプリケーションコンテナ起動時にデータベース接続が必要な場合はどうすれば良いのか?
アプリケーションコンテナのエントリーポイントでデータベースの接続確認をすれば解決します。
app.Dockerfile
# 構築処理
...
# エントリーポイントでMYSQLのサービスの確認をします
# ホスト名は「データベース」のコンテナ名、その他 IDとパスワードは root で作成していることが前提になります
# 下記のループはmysqlに接続をし、接続できなかったら 1秒間停止 して接続できるようになるまで再実行します。
RUN { \
echo '#!/bin/bash'; \
echo "while true; do if [ -z \"\$(exit | mysql -h db -u root -proot 2>&1 > /dev/null)\" ]; then break; else sleep 1; fi done"; \
# データベース接続が必要な処理やサービス立ち上げを記載
} > /usr/local/bin/app.sh
ENTRYPOINT ["/usr/local/bin/app.sh"]
※コンテナ開発時には注意しましょう。