はじめに
docker-composeで依存関係にあるコンテナでヘルスチェックを行うことで、コンテナの実行タイミングを制御する設定を行いました。
実現したいこと
docker-composeを使用してDBコンテナとアプリコンテナを起動しています。(過去記事)
depends_on
でDBコンテナ起動後にアプリコンテナが起動するようにしたいのですが、下記の記述では、DBコンテナのサービスの準備が整う前にアプリが起動してしまい、
jango.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)”
というエラーになることがありました。
version: '3.9'
services:
db:
container_name: mysql
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -u $$MYSQL_ROOT_USER -p$$MYSQL_ROOT_PASSWORD || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
volumes:
- db_data:/var/lib/mysql
django:
container_name: django
build: .
command: python manage.py runserver 0.0.0.0:8000
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_ROOT_USER: ${MYSQL_ROOT_USER}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
db:
condition: service_healthy
phpmyadmin:
image: phpmyadmin/phpmyadmin
platform: linux/amd64
depends_on:
db:
condition: service_healthy
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_ROOT_USER: ${MYSQL_ROOT_USER}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
- "3000:80"
volumes:
- ./phpmyadmin/sessions:/sessions
volumes:
db_data:
結論
dbコンテナでヘルスチェックを実施し、ヘルスチェックの結果が正常であることを確認してから起動するよう depends_on
を修正しました。
version: '3.9'
services:
db:
container_name: mysql
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
healthcheck: #追加
test: ["CMD-SHELL", "mysqladmin ping -h localhost -u $$MYSQL_ROOT_USER -p$$MYSQL_ROOT_PASSWORD || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
volumes:
- db_data:/var/lib/mysql
django:
container_name: django
build: .
command: python manage.py runserver 0.0.0.0:8000
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_ROOT_USER: ${MYSQL_ROOT_USER}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
db:
condition: service_healthy #追加
volumes:
db_data:
下記のようにDBコンテナのヘルスチェック実施後にアプリコンテナを実行するようになりました!
参考サイト
Docker の healthcheck を初めて使った話
docker-compose の depends_on と healthcheck について