
새로운 프로젝트의 로컬 infra 를 docker-compose.yml 파일을 통해 정의하고 docker-compose up 명령어를 실행했더니, 다른 프로젝트의 컨테이너가 삭제 되었다.
문제가 발생하는 원인의 key 는 project name 에 있었다.
우선 project name 이 무엇인지 부터 알아보자.
docker-compose up 명령어로 컨테이너가 올라갈 때, Compose 는 "project name" 이란 것을 사용하여 환경을 격리시킨다고 한다.
별도의 옵션이 명시되지 않는 경우, "project name" 은 docker-compose.yml 파일이 위치한 Base 디렉터리 명으로 생성된다.
예를 들어, ~/projectA/local-infra/database 디렉터리에 있는 docker-compose.yml 파일을 기반으로 docker-compose up 명령어를 실행하면 database 라는 project name 을 갖게 된다.
특정 container 의 project name 은 아래 명령어로 확인이 가능하다.
$> docker inspect {컨테이너 이름} | grep "com.docker.compose.project"

나는 각 프로젝트 마다 비슷한 폴더 구조로 로컬 infra 를 설정했었다.
(참고: 프로젝트 로컬 mysql DB 설정하기 (feat. docker-compose))
docker-compose.yml 이 위치한 Base 디렉터리가 항상 database 였고, 따라서 각각 다른 프로젝트에서 docker-compose up 명령어를 수행해도 같은 project name 을 갖게 된 것이었다.
결국 같은 공간(?)에 컨테이너들이 생성이 되며 같은 서비스 명을 갖는 컨테이너는 overwrite 되었던 것이다.
(프로젝트는 달라도 아래와 같이 mysql 이라는 같은 서비스명을 사용하고 있었다.)
services:
mysql:
근본적으로 project name 이 같기 때문에 발생하는 문제였는데, 프로젝트 별로 project name 을 다르게 설정할 수 있다면 해결된다.
개인적으로 아래 방법들 중 방법 2가 명령어와 옵션이 분리되어 관리하기 더 수월할 것 같아서 방법 2를 채택했다.
아래와 같이 -p 옵션으로 프로젝트 명을 직접 설정할 수 있다.
$> docker-compose -p {프로젝트 명} up -d
## 예시
$prjectA/local-infra/database> docker-compose -p order-service up -d
$prjectB/local-infra/database> docker-compose -p user-service up -d
위와 같이 -p 옵션으로 다른 project name 을 주면, 각각 다른 project name 이 assign 되어 서로 간섭하지 않고 컨테이너가 독립적으로 관리된다.
docker-compose.yml 파일과 동일한 폴더에 .env 파일을 생성하고 COMPOSE_PROJECT_NAME 프로퍼티를 명시하면, docker-compose up 명령어 수행 시 해당 프로퍼티 값으로 project name 이 assign 된다.
(-p 와 같은 별도의 옵션을 줄 필요가 없다)
COMPOSE_PROJECT_NAME=order-service
예를 들어 위와 같이 .env 파일을 작성하여 docker-compose.yml 파일과 같은 디렉터리에 저장한 뒤, docker-compose up -d 명령어를 수행하면 project name 이 order-service 로 assign 된다.