0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

docker-composeでアプリケーションコンテナとデータベースコンテナを立ち上げる

Last updated at Posted at 2021-05-08

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

※コンテナ開発時には注意しましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?