팀과제를 진행하면서 프로젝트 초기설정을 진행하던 중, 도커 컴포즈에서 DB 연결 지연 이슈가 발생했다. 같은 팀원분이 해결 방법을 알려주셨고, 구글링을 통해 어떻게 해결되었는지를 정리한다.
문제 상황
문제 원인
depends_on
은 서비스의 시작과 종료를 제어할 수 있는 설정 옵션depends_on
으로 서비스의 의존성을 명시하더라도, 의존받는 서비스의 ‘준비’ 상태를 보장하지는 않음문제 해결
services:
api:
build:
context: .
dockerfile: DockerFile
volumes:
- ./src:/api/src
restart: always
ports:
- ${SERVER_PORT}:${SERVER_PORT}
depends_on:
dev_db:
condition: service_healthy
networks:
- container-network
dev_db:
image: mysql:latest
container_name: db
environment:
MYSQL_ROOT_USER: ${MYSQL_ROOT_USER}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
restart: always
ports:
- ${MYSQL_PORT}:${MYSQL_PORT}
networks:
- container-network
healthcheck:
test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost', '-u', 'root', '-p$$MYSQL_ROOT_PASSWORD']
timeout: 20s
retries: 10
networks:
container-network:
driver: bridge
depends_on
, healthcheck
관련 옵션을 통해 해결하였음depends_on
의 condition
속성에 다음 값들을 사용하는 것service_started
service_healthy
service_completed_successfully
service_healthy
값은 의존하는 서비스가 시작되기 전 의존받는 서비스의 healthcheck
에 정의된 대로 의존받는 서비스가 ‘건강한’ 상태가 되어야 함을 지정함healthcheck
에서 정의한 대로 dev_db가 ‘건강한’ 상태가 되면 dev_db 서비스를 의존하는 api 서비스가 실행된다는 의미healthcheck
은 서비스 컨테이너가 ‘건강한’ 상태인지를 결정하기 위한 진단을 선언함test
도커 컴포즈가 컨테이너의 건강을 확인하기 위해 실행하는 커맨드를 정의함test
에 정의한 커맨드CMD mysqladmin ping -h localhost -u root -p$$MYSQL_ROOT_PASSWORD
timeout
한 번의 건강 진단이 명시한 시간보다 오래 걸리면 해당 건강 진단은 실패로 간주됨retries
컨테이너에 대한 건강 진단 진행 횟수참고 링크