로컬 환경과 가상 서버 환경에서 서로 다른 `command`를 사용해야 하는 경우, 환경 변수를 활용하여 `docker-compose` 파일에서 조건에 맞는 명령을 실행할 수 있습니다. 이 방법을 사용하면 동일한 `docker-compose.yml` 파일을 유지하면서, 로컬과 서버에서 다른 명령을 실행할 수 있습니다.
1. 환경 변수 파일을 이용하는 방법 (`.env`)
`docker-compose`는 환경 변수 파일을 지원합니다. 이를 이용해 환경에 따라 다른 값을 설정할 수 있습니다.
1.1 `.env` 파일 생성
로컬과 서버 환경에서 서로 다른 설정을 적용하려면, 각 환경에 맞는 환경 변수를 사용할 수 있습니다.
로컬 환경의 `.env` 파일 (로컬 환경에서 실행될 명령어를 지정):
COMMAND="npm install && npm run dev"
가상 서버 환경의 `.env` 파일 (가상 서버에서 실행될 명령어를 지정):
COMMAND="npm run start"
이 `.env` 파일을 로컬과 가상 서버 각각의 환경에 맞게 설정한 후 사용하면 됩니다.
1.2 `docker-compose.yml` 파일 수정
`docker-compose.yml` 파일에서 명령어를 환경 변수로 지정해 주면, 환경에 맞는 명령을 실행할 수 있습니다.
services:
node-app:
image: node:latest
working_dir: /app
volumes:
- ./node-app:/app
command: sh -c "${COMMAND}" # 환경 변수로 명령어를 실행
expose:
- "3000"
이렇게 하면 로컬에서는 `.env` 파일의 `COMMAND=”npm install && npm run dev”` 값이 적용되어 개발 모드로 실행되고, 가상 서버에서는 `COMMAND=”npm run start”`가 적용되어 프로덕션 모드로 실행됩니다.
2. Docker Compose 파일을 여러 개로 분리하는 방법
또 다른 방법으로는, `docker-compose.override.yml` 파일을 이용해 로컬 환경에서만 적용되는 명령을 정의하고, 기본 `docker-compose.yml` 파일은 서버 환경에 맞추는 방법이 있습니다.
2.1 기본 `docker-compose.yml`
가상 서버 환경에 맞춘 설정을 기본 `docker-compose.yml`에 작성합니다.
services:
node-app:
image: node:latest
working_dir: /app
volumes:
- ./node-app:/app
command: sh -c "npm run start" # 기본적으로 가상 서버에서 실행될 명령어
expose:
- "3000"
2.2 로컬용 `docker-compose.override.yml`
로컬에서 개발할 때 사용하는 명령어를 `docker-compose.override.yml` 파일에 작성합니다.
services:
node-app:
command: sh -c "npm install && npm run dev" # 로컬에서 실행할 명령어
2.3 실행 방법
로컬에서는 기본적으로 `docker-compose up`을 실행하면 `docker-compose.override.yml` 파일의 설정이 자동으로 포함되어 로컬 개발 명령어가 실행됩니다. 반면, 서버에서는 `docker-compose.override.yml` 파일이 없으므로 기본 설정 파일의 명령어만 실행됩니다.
3. 환경 변수를 직접 전달하는 방법
환경 변수를 직접 커맨드라인에서 전달하는 방법도 있습니다. 이 방법을 사용하면 별도의 `.env` 파일 없이도 환경에 따라 다른 명령을 전달할 수 있습니다.
로컬에서 실행:
COMMAND="npm install && npm run dev" docker-compose up
서버에서 실행:
COMMAND="npm run start" docker-compose up
이 방법은 각 환경에서 명령어를 다르게 전달하는 가장 간단한 방법입니다.
결론
- 환경 변수를 활용한 방법: `.env` 파일을 사용해 로컬과 서버에서 서로 다른 `command`를 설정.
- `docker-compose.override.yml` 활용: 로컬 환경에서만 적용되는 추가 설정을 분리하여 관리.
- 환경 변수를 직접 전달하는 방법: 각 환경에서 명령을 직접 전달하여 설정.
이 중에서 환경 변수와 `.env` 파일을 사용하는 방법이 가장 직관적이며, 로컬과 서버 환경을 쉽게 구분할 수 있는 좋은 방법입니다.