기본 패턴
yaml
services:
web:
build: .
depends_on:
db:
condition: service_healthy
db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
retries: 5설명
depends_on은 서비스 생성과 시작 순서를 제어하지만, 짧은 문법만으로는 "완전히 준비됨"까지 보장하지 않습니다.- 예를 들어 DB 컨테이너가 실행 상태가 되었더라도, 실제 쿼리를 받을 준비는 아직 안 됐을 수 있습니다.
- 이때
healthcheck와condition: service_healthy를 함께 쓰면, 의존 서비스가 건강 상태를 만족한 뒤 다음 서비스가 시작되게 만들 수 있습니다. - 따라서 "실행 중"과 "준비 완료"를 구분하는 감각이 멀티컨테이너에서 중요합니다.
- 운영뿐 아니라 로컬 개발에서도 이 차이를 잡아 주면, 앱이 먼저 켜졌다가 DB 연결 실패로 바로 죽는 문제를 줄일 수 있습니다.
짧은 예제
text
문제:
- app와 db를 같이 올렸더니
- db는 컨테이너가 떴지만 아직 준비 전
- app가 먼저 접속해 실패
개선:
- db에 healthcheck 추가
- app는 service_healthy를 기다리게 설정빠른 정리
| 항목 | 의미 |
|---|---|
depends_on | 의존 서비스의 시작 순서를 정의 |
service_started | 컨테이너가 시작됐는지만 확인 |
service_healthy | healthcheck 통과까지 기다림 |
healthcheck | 준비 상태를 판정하는 명령 |
| 핵심 구분 | 실행 중과 준비 완료는 다름 |
주의할 점
depends_on만 넣고 안심하면 안 됩니다. 특히 DB, 캐시, 메시지 큐처럼 준비 시간이 있는 서비스는
healthcheck까지 같이 설계해야 실제 실패를 줄일 수 있습니다.
참고 링크
2 sources