【Docker】DBの起動完了を待ってから他のサービスを起動する方法


はじめに

 本記事は、プログラミング初学者、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

DBの起動完了を待ってから他のサービスを起動する方法

docker-compose.ymlのdepends_on/conditonを設定する方法

以下のようにdepends_onconditionservice_healthyを設定し、dbのhealthchecktestを設定することでDBの起動完了後に他のサービスを起動させることができます。
testのインターバルがデフォルトでは30秒ほどのようでヘルスチェックに時間がかかるため、intarval1sに設定しています。

docker-compose.yml
version: '${COMPOSE_VER}'
services:
  db:
    platform: linux/x86_64
    image: mysql:${DB_IMAGE_TAG}
    command: --default-authentication-plugin=mysql_native_password && bash -c "chmod +x /docker-entrypoint-initdb.d/00_grant.sh"
    healthcheck:
      test: mysqladmin ping -h db -u$${MYSQL_USER} -p$${MYSQL_PASSWORD}
      interval: 1s
    volumes:
      - mysql_data:/var/lib/mysql
      - ${MY_CNF_PATH}:/etc/mysql/conf.d/my.cnf
      - ${INITDB_PATH}:/docker-entrypoint-initdb.d
    env_file:
      - ${DB_ENV_FILE_PATH}
    ports:
      - "${DB_PORT}:3306"
  api:
    build:
      context: .
      dockerfile: ./docker/api/Dockerfile
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    environment:
      RAILS_ENV: ${APP_ENV}
    ports:
      - "${API_PORT}:3000"
    depends_on:
      db:
        condition: service_healthy
volumes:
  mysql_data: