[ 살펴보기 ] Docker - Compose Override
![[ 살펴보기 ] Docker - Compose Override](https://cdn.hashnode.com/res/hashnode/image/upload/v1720260050802/f55896d9-8a9f-40c1-add9-160cb03ed209.jpeg)
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을 유념하여 예기치 못한 결과를 방지할 수 있도록 하자.
![[ 살펴보기 ] RDB - Relationships](https://cdn.hashnode.com/res/hashnode/image/upload/v1739711556668/48dc9e84-a621-42aa-9c9f-5fc5c436f0ec.jpeg)
![[ 살펴보기 ] MySQL - Data types](https://cdn.hashnode.com/res/hashnode/image/upload/v1739593589113/530f8704-4d27-42c9-a451-bb5c63150b99.jpeg)
![[ 살펴보기 ] TypeORM - Transactions, Migration](https://cdn.hashnode.com/res/hashnode/image/upload/v1739106042581/980b8133-61d4-406a-a026-65be9c28eace.jpeg)
![[ 살펴보기 ] TypeORM - Relations](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666874402/b688bd0b-b6bb-4f43-87d8-c1b46b59f1b7.jpeg)
![[ 살펴보기 ] TypeORM - Basics](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666803591/bef5df17-7dc7-4123-ae55-004d5042df39.jpeg)