docker-composeで別コンテナのサービスが完全に立ち上がるのを待つ

2023/02/06に公開

概要

docker-compose で複数のコンテナを起動する際に起動順序を制御したいことは多々ある。
具体的には MySQL のコンテナと DB にアクセスする API サーバのコンテナを起動する際に、MySQL のコンテナを先に立ち上げたい、等である。
この「先に立ち上げる」をどこまで厳密に行うかは匙加減がある。
単純な例では物理的なサーバを想像した際 MySQL 側のサーバの電源を先に入れれば十分という場合がある。
一方電源を ON にした後 mysqld のプロセスが立ち上がり、外部アクセス可能な状態になってから API サーバの電源を入れたいということもある。
これらの制御法について解説する。

dependes_on

例えば phpmyadmin の様に、利用する側が DB にアクセスするのがコンテナを立ち上げた直後ではなく、単純に MySQL 側のコンテナの電源を先に入れるだけで十分な場合は以下の通りで良い。

version: '3'

services:
  phpmyadmin:
    image: phpmyadmin:latest
    depends_on:
      - db
    ...db:
    image: mysql:8.0
    ...

healthcheck

API サーバなどで、立ち上げ直後に自動でデータを DB から取得するコマンドなどが発行される場合は以下のようにする。

  • まず先に立ち上げるべきコンテナ (DB) で healthcheck を定義する。
    • <change_me> の部分は db アクセスのためのパスワードに置き換える
  • 利用する側 (API サーバ) で condtion: service_healthy を要求する。
version: '3'

services:
 backend:
    build: ./docker/fastapi
    depends_on:
      db:
        condition: service_healthy
    ...db:
    image: mysql:8.0
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "root", "-p<chengeme>"]
      timeout: 20s
      retries: 10
    ...

Discussion