Skip to main content

Command Palette

Search for a command to run...

[ 살펴보기 ] Docker - Compose Override

Updated
3 min readView as Markdown
[ 살펴보기 ] Docker - Compose Override
C

A developer living in Busan, Korea

Application을 개발할 때면 여러 환경을 통해 개발과 배포가 진행된다. 개발자 Local 머신에서 사용하는 개발 환경과 QA 테스트를 진행할 수 있는 테스트 서버 환경 등. 이러한 환경에 대한 compose 파일을 보다 효율적으로 관리하기 위해 override를 활용할 수 있다

예를 들어 개발 환경과 테스트 환경에 대한 compose파일을 구성한다면 두 환경에서공통으로 필요한 정보를 가지고 있는 기본 docker-compose.yml 파일과 개발 환경에 필요한 정보를 가지고 있는 docker-compose-dev.yml 그리고 테스트 환경을 위한 docker-compose-test.yml를 만들어서 실행환경에 맞게 기본 docker-compose.yml를 override하는 것이다

간단한 예제를 통해 override 과정을 살펴보자. 다음은 dev, test compose 파일의 기본이 되는 docker-compose 파일과 dev 환경에 사용되는 docker-compose-dev 파일 그리고 테스트 환경에 사용되는 docker-compose-test 파일의 예제이다

# docker-compose.yml

version: "1.0.0"

services:
  backend-container:
    container_name: backend-container
    image: test-volume-backend
    networks:
      - backend-network

networks:
  backend-network:

dev 환경에서는 port를 5000으로 mapping하고 network는 backend-dev-network를 사용한다고 가정한다면 아래와 같이 compose파일을 구성한다

# docker-compose-dev.yml

version: "1.0.0"

services:
  backend-container:
    ports:
      - 5000:4000

networks:
  backend-network:
    name: backend-dev-network
    external: true

test 환경에서는 port를 6000으로 mapping하고 network는 backend-test-network를 사용한다고 가정한다면 아래와 같이 compose파일을 구성한다

# docker-compose-test.yml

version: "1.0.0"

services:
  backend-container:
    ports:
      - 6000:4000

networks:
  backend-network:
    name: backend-test-network
    external: true

위의 예제에서 볼수 있듯이 override 파일에선 변경할 항목만 명시하면 된다. docker-compose-dev, docker-compose-test 파일 모두 변경이 필요한 port와 network 부분만 명시되어있다.

override할 compose 파일이 준비되면 config 명령어를 통해 override된 compose 내용을 미리 확인해볼 수 있다. 다음 명령어를 실행해보자

docker compose -f ./docker-compose.yml -f ./docker-compose-dev.yml config
services:
  backend-container:
    container_name: backend-container
    image: test-volume-backend
    networks:
      backend-network: null
    ports:
      - mode: ingress
        target: 5000
        published: "5000"
        protocol: tcp
networks:
  backend-network:
    name: backend-dev-network
    external: true

override를 적용한 compose를 실행시킬 땐 다음 명령어를 통해 실행한다. 아래 command를 실행하면 위에서 config 명령으로 봤던 compose의 내용이 적용되어 실행된다

docker compose -f ./docker-compose.yml -f ./docker-compose-dev.yml up -d

override compose로 생성한 리소스를 다시 삭제하려면 다음과 같이 처리 할 수 있다

docker compose down
or
docker compose -f ./docker-compose.yml -f ./docker-compose-dev.yml down

override는 다음과 같이 환경에 따른 다른 환경변수를 적용하는 경우에도 유용하다. 아래의 예제처럼 dev 환경을 위한 compose 파일에서는 .env.dev 파일을 통해 환경변수를 사용하고 test 환경을 위한 compose 파일에서는 .env.test 파일을 통해 환경변수를 사용하도록 설정할 수 있다

# docker-compose-dev.yml

version: "1.0.0"

services:
  backend-container:
    env_file:
      - .env.dev
# docker-compose-test.yml

version: "1.0.0"

services:
  backend-container:
    env_file:
      - .env.test

Merge rules

여러 compose file을 통해 override를 할 때 주의해야 할 점이 있다. compose를 이루는 설정 값 중 image:test-image 와 같이 단일 값을 받는 proprty라면 override가 되지만 port나 volume과 같이 복수의 값을 받는 proprty라면 override가 아니라 merge가 될 수 있다.

다음 예제를 살펴보자

// docker-compose.yml
services:
  backend-container:
    container_name: backend-container
    image: base-backend

// docker-compose-dev.yml
services:
  backend-container:
    image: test-backend

// 최종 compose 체크 명령어
docker compose -f ./docker-compose.yml -f ./docker-compose-dev.yml config

// 최종 compose 설정 값
services:
  backend-container:
    container_name: backend-container
    image: test-backend

위의 예제에선 docker-compose-dev 파일에서 설정한 image property가 최종 compose 설정 값에 override된 것을 확인할 수 있다. 하지만 port와 같이 복수 값을 받는 property는 다음과 같이 merge가 된다

// docker-compose.yml
services:
  backend-container:
    container_name: backend-container
    image: base-backend
    ports:
      - 4000:4000

// docker-compose-dev.yml
services:
  backend-container:
    ports:
      - 5000:4000

// 최종 compose 체크 명령어
docker compose -f ./docker-compose.yml -f ./docker-compose-dev.yml config

// 최종 compose 설정 값
services:
  backend-container:
    container_name: backend-container
    image: test-backend
    ports:
      - mode: ingress
        target: 4000
        published: "4000"
        protocol: tcp
      - mode: ingress
        target: 4000
        published: "5000"
        protocol: tcp

자세한 Merge rules은 Docker documentation에서 확인할 수 있다. merge rules을 유념하여 예기치 못한 결과를 방지할 수 있도록 하자.

More from this blog

[ 살펴보기 ] TypeORM - Transactions, Migration

Transation Database 종류에 따라 detail한 부분은 차이점이 조금씩 있겠지만 각 sql statement는 개별적인 transaction block을 통해 실행되며 Database 설정에 따라 sql statement의 실행 결과가 자동으로 commit되어 영구히 적용되거나 commit을 직접 실행하기 전까지는 영구히 적용되지 않을 수 있다. 대부분의 경우 default로 sql statement 실행 결과가 자동으로 comm...

Feb 9, 20256 min read
[ 살펴보기 ] TypeORM - Transactions, Migration

Dev Diary

184 posts