hyunsu blog

홈노트예시 글

--profile 을 붙인 down 이 전 서비스를 내렸다

분류
노트 N-06
공개
갱신
읽는 시간
6분

요약

docker compose 의 --profile 은 올릴 때(up) 대상을 넓힐 뿐, 내릴 때(down) 대상을 좁혀 주지 않는다. down 은 프로젝트 전체를 내린다. 서비스 하나만 내리려면 stop 이나 rm -sf 에 이름을 대야 한다.

목차 · 4
  1. 01무슨 일이 있었나?
  2. 02왜 전부 내려갔나?
  3. 03무엇을 바꿨나?
  4. 04다시 겪지 않으려면?

결론부터 적는다. docker compose --profile sandbox down 은 sandbox 만 내리지 않는다. 같은 프로젝트의 모든 컨테이너를 내린다. 이 한 줄로 프록시·DB·캐시가 함께 멈췄고, 운영 중인 서비스 전부가 몇 분 동안 응답하지 않았다. 데이터는 잃지 않았다.

01 무슨 일이 있었나?

쓰지 않는 실험 도구(코드 실행 샌드박스)를 정리하던 중이었다. 샌드박스는 평소 꺼 두려고 profile 로 묶어 두었고, 켤 때는 make up-sandbox, 끌 때는 make down-sandbox 를 썼다. 끄는 쪽의 실체가 아래 한 줄이었다.

bash
# Makefile 의 down-sandbox — 문제의 한 줄
docker compose --profile sandbox down

명령은 오류 없이 끝났다. 몇 십 초 뒤 밖에서 보는 헬스체크가 모든 대상의 실패를 알렸다.

타임라인

시각일
14:02make down-sandbox 실행
14:03외부 헬스체크 — 전 대상 실패
14:05docker ps — 코어 컨테이너 0개 확인
14:07코어 다시 기동
14:11전 서비스 정상 응답

02 왜 전부 내려갔나?

--profile 은 무엇을 켤지 고르는 옵션이다. up 에서는 그 profile 이 붙은 서비스까지 대상에 넣는다. 그런데 down 은 profile 과 상관없이 프로젝트에 속한 컨테이너를 전부 멈추고 지운다. 이름을 대지 않으면 대상은 프로젝트 전체다.

profile 이 없는 서비스는 "항상 켜지는" 서비스다. 코어(프록시·DB·캐시)가 여기에 속하므로, down 이 코어를 건드리는 순간 그 위의 모든 서비스가 끊긴다.

--profile 은 up 에서만 대상을 좁힌다. down 에서는 무시된다.

— 그날 운영 기록에 남긴 한 줄
up --profile sandbox 대상 = 코어 3 + sandbox 2 프로젝트 profile 없음 · 코어 proxy 켜짐 db 켜짐 cache 켜짐 profile: sandbox runner 켜짐 sandbox-db 켜짐 down --profile sandbox 대상 = 프로젝트 전체 프로젝트 profile 없음 · 코어 proxy 내림 db 내림 cache 내림 의도 밖 — 코어까지 내려갔다 profile: sandbox runner 내림 sandbox-db 내림 up --profile sandbox 대상 = 코어 3 + sandbox 2 프로젝트 profile 없음 · 코어 proxy 켜짐 db 켜짐 cache 켜짐 profile: sandbox runner 켜짐 sandbox-db 켜짐 down --profile sandbox 대상 = 프로젝트 전체 프로젝트 profile 없음 · 코어 proxy 내림 db 내림 cache 내림 의도 밖 — 코어까지 내려갔다 profile: sandbox runner 내림 sandbox-db 내림
그림 1. profile 은 up 의 대상을 넓히지만, down 의 대상을 좁히지는 않는다.

03 무엇을 바꿨나?

명령을 바꾸고, 규칙을 운영 문서 맨 위로 올렸다.

diff
 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 <서비스> — 멈추고 컨테이너를 지운다. 볼륨은 남는다.

먼저 대상을 본다

bash
docker compose ps --services --filter status=running

04 다시 겪지 않으려면?

  • 완료: Makefile 의 모든 내리기 명령에 서비스 이름을 댄다
  • 완료: 운영 규칙 맨 위에 "profile 로 down 하지 않는다" 를 박는다
  • 완료: 밖에서 보는 헬스체크가 5분 안에 알리는지 확인했다
  • 할 일: 새 profile 을 만들 때 이 글을 체크리스트에 링크한다

무엇이 지워질지 모르겠으면 docker compose --dry-run 을 앞에 붙여 먼저 본다. 버전에 따라 동작이 다를 수 있으니, 쓰는 버전에서 한 번 확인하는 편이 싸다.

  1. 대상 이름을 뽑는다.
  2. 이름을 대고 멈춘다.
  3. ps 로 코어가 살아 있는지 본다.

한 줄로 줄이면 이렇다. 끄는 명령에는 이름을 댄다.
자세한 옵션은 Compose 의 profiles 문서에 있다. profile 은 켜고 끄는 스위치다 — 켜는 스위치일 뿐이다.