--profile 을 붙인 down 이 전 서비스를 내렸다
- 분류
- 노트 N-06
- 공개
- 갱신
- 읽는 시간
- 6분
요약
docker compose 의 --profile 은 올릴 때(up) 대상을 넓힐 뿐, 내릴 때(down) 대상을 좁혀 주지 않는다. down 은 프로젝트 전체를 내린다. 서비스 하나만 내리려면 stop 이나 rm -sf 에 이름을 대야 한다.
결론부터 적는다. docker compose --profile sandbox down 은 sandbox 만 내리지 않는다. 같은 프로젝트의 모든 컨테이너를 내린다. 이 한 줄로 프록시·DB·캐시가 함께 멈췄고, 운영 중인 서비스 전부가 몇 분 동안 응답하지 않았다. 데이터는 잃지 않았다.
01 무슨 일이 있었나?
쓰지 않는 실험 도구(코드 실행 샌드박스)를 정리하던 중이었다. 샌드박스는 평소 꺼 두려고 profile 로 묶어 두었고, 켤 때는 make up-sandbox, 끌 때는 make down-sandbox 를 썼다. 끄는 쪽의 실체가 아래 한 줄이었다.
# Makefile 의 down-sandbox — 문제의 한 줄
docker compose --profile sandbox down
명령은 오류 없이 끝났다. 몇 십 초 뒤 밖에서 보는 헬스체크가 모든 대상의 실패를 알렸다.
타임라인
| 시각 | 일 |
|---|---|
| 14:02 | make down-sandbox 실행 |
| 14:03 | 외부 헬스체크 — 전 대상 실패 |
| 14:05 | docker ps — 코어 컨테이너 0개 확인 |
| 14:07 | 코어 다시 기동 |
| 14:11 | 전 서비스 정상 응답 |
02 왜 전부 내려갔나?
--profile 은 무엇을 켤지 고르는 옵션이다. up 에서는 그 profile 이 붙은 서비스까지 대상에 넣는다. 그런데 down 은 profile 과 상관없이 프로젝트에 속한 컨테이너를 전부 멈추고 지운다. 이름을 대지 않으면 대상은 프로젝트 전체다.
profile 이 없는 서비스는 "항상 켜지는" 서비스다. 코어(프록시·DB·캐시)가 여기에 속하므로, down 이 코어를 건드리는 순간 그 위의 모든 서비스가 끊긴다.
--profile은up에서만 대상을 좁힌다.down에서는 무시된다.
up 의 대상을 넓히지만, down 의 대상을 좁히지는 않는다.03 무엇을 바꿨나?
명령을 바꾸고, 규칙을 운영 문서 맨 위로 올렸다.
down-sandbox:
- docker compose --profile sandbox down
+ docker compose stop sandbox-runner sandbox-db
+ docker compose rm -f sandbox-runner sandbox-db
docker compose down -v 는 여기에 더해 볼륨까지 지운다. DB 볼륨이 사라진다. 볼륨을 지워야 하면 먼저 백업하고, 무엇이 지워지는지 적은 뒤에 한다.
이름을 대는 두 가지 방법
stop <서비스>— 멈추기만 한다.start로 다시 켠다.rm -sf <서비스>— 멈추고 컨테이너를 지운다. 볼륨은 남는다.
먼저 대상을 본다
docker compose ps --services --filter status=running
04 다시 겪지 않으려면?
- 완료: Makefile 의 모든 내리기 명령에 서비스 이름을 댄다
- 완료: 운영 규칙 맨 위에 "profile 로 down 하지 않는다" 를 박는다
- 완료: 밖에서 보는 헬스체크가 5분 안에 알리는지 확인했다
- 할 일: 새 profile 을 만들 때 이 글을 체크리스트에 링크한다
무엇이 지워질지 모르겠으면 docker compose --dry-run 을 앞에 붙여 먼저 본다. 버전에 따라 동작이 다를 수 있으니, 쓰는 버전에서 한 번 확인하는 편이 싸다.
- 대상 이름을 뽑는다.
- 이름을 대고 멈춘다.
ps로 코어가 살아 있는지 본다.
한 줄로 줄이면 이렇다. 끄는 명령에는 이름을 댄다.
자세한 옵션은 Compose 의 profiles 문서에 있다. profile 은 켜고 끄는 스위치다 — 켜는 스위치일 뿐이다.