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:808443:443 둘 다 노출됐을 거예요.

추가 리소스 (Additional resources)

여러 Compose 파일로 합성 Compose 파일을 만드는 방법은 "Working with multiple Compose files" 를 참고해요.

더 알아보기 (Learn more)

  • 여러 Compose 파일 작업 가이드를 참고해요.