Compose 파일 병합
Compose 파일 병합 (Merge Compose files)
Compose는 여러 Compose 파일을 통해 Compose 애플리케이션 모델을 정의할 수 있게 해요. 그렇게 할 때 Compose는 Compose 파일을 병합하는 특정 규칙을 따라요. 이 페이지는 그 규칙을 설명해요.
출처: 문서
본문
매핑 (Mapping)
YAML 매핑은 누락된 항목을 추가하고 충돌하는 항목을 병합해 병합돼요.
다음 예시 YAML 트리를 병합하면:
services:
foo:
key1: value1
key2: value2
services:
foo:
key2: VALUE
key3: value3
다음 YAML 트리와 동등한 Compose 애플리케이션 모델이 돼요:
services:
foo:
key1: value1
key2: VALUE
key3: value3
시퀀스 (Sequence)
YAML 시퀀스는 오버라이딩 Compose 파일의 값을 이전 값에 추가해 병합돼요.
다음 예시 YAML 트리를 병합하면:
services:
foo:
DNS:
- 1.1.1.1
services:
foo:
DNS:
- 8.8.8.8
다음 YAML 트리와 동등한 Compose 애플리케이션 모델이 돼요:
services:
foo:
DNS:
- 1.1.1.1
- 8.8.8.8
예외 (Exceptions)
셸 명령 (Shell commands)
command, entrypoint, healthcheck: test 서비스 속성을 사용하는 Compose 파일을 병합할 때 값은 추가되지 않고 최신 Compose 파일이 오버라이드해요.
다음 예시 YAML 트리를 병합하면:
services:
foo:
command: ["echo", "foo"]
services:
foo:
command: ["echo", "bar"]
다음 YAML 트리와 동등한 Compose 애플리케이션 모델이 돼요:
services:
foo:
command: ["echo", "bar"]
고유 리소스 (Unique resources)
ports, volumes, secrets, configs 서비스 속성에 적용돼요. 이 유형들은 Compose 파일에서 시퀀스로 모델링되지만 고유성 요구 사항이 있어요:
| 속성 | 고유 키 | | volumes | target | | secrets | target | | configs | target | | ports | {ip, target, published, protocol} |
Compose 파일을 병합할 때 Compose는 고유성 제약을 위반하지 않는 새 항목을 추가하고 고유 키를 공유하는 항목을 병합해요.
다음 예시 YAML 트리를 병합하면:
services:
foo:
volumes:
- foo:/work
services:
foo:
volumes:
- bar:/work
다음 YAML 트리와 동등한 Compose 애플리케이션 모델이 돼요:
services:
foo:
volumes:
- bar:/work
값 리셋 (Reset value)
앞서 설명한 메커니즘에 더해, 오버라이드 Compose 파일은 애플리케이션 모델에서 요소를 제거하는 데도 사용할 수 있어요. 이를 위해 커스텀 YAML 태그 !reset을 사용해 오버라이드된 Compose 파일이 설정한 값을 오버라이드할 수 있어요. 속성에 유효한 값을 제공해야 하지만 그 값은 무시되고 대상 속성은 유형의 기본값 또는 null로 설정돼요.
가독성을 위해 속성 값을 명시적으로 null 또는 빈 배열 [](!reset null 또는 !reset [])로 설정해 결과 속성이 지워질 것임을 명확히 하는 것이 좋아요.
기본 compose.yaml 파일:
services:
app:
image: myapp
ports:
- "8080:80"
environment:
FOO: BAR
compose.override.yaml 파일:
services:
app:
image: myapp
ports: !reset []
environment:
FOO: !reset null
결과는:
services:
app:
image: myapp
값 대체 (Replace value)
요구 사항: Docker Compose 2.24.4 이상
!reset이 오버라이드 파일을 사용해 Compose 파일에서 선언을 제거할 수 있는 반면, !override는 표준 병합 규칙을 우회해 속성을 완전히 대체할 수 있게 해요. 전형적인 예는 같은 이름을 쓰지만 별개의 모델에 의존하도록 리소스 정의를 완전히 대체하는 경우예요.
기본 compose.yaml 파일:
services:
app:
image: myapp
ports:
- "8080:80"
원래 포트를 제거하고 새 포트를 노출하려면 다음 오버라이드 파일을 사용해요:
services:
app:
ports: !override
- "8443:443"
결과는:
services:
app:
image: myapp
ports:
- "8443:443"
!override를 사용하지 않았다면 위에 설명한 병합 규칙에 따라 8080:80과 8443:443 둘 다 노출됐을 거예요.
추가 리소스 (Additional resources)
여러 Compose 파일로 합성 Compose 파일을 만드는 방법은 "Working with multiple Compose files" 를 참고해요.
더 알아보기 (Learn more)
- 여러 Compose 파일 작업 가이드를 참고해요.