여러 컨테이너를 구동 시 동일한 환경 변수를 이용할 때, 혹은 한 컨테이너에 대해 상황에 따라 다른 환경 변수를 동적으로 주입해 줘야 할 때 docker-compose에서는 환경 변수를 주입해 줄 수 있도록 여러 방법을 지원한다.
나의 경우 동일한 내용의 컨테이너를 병렬 적으로 여러 개 구동하나 동일한 환경 변수를 사용하기에 하나의 파일로 환경 변수를 사용하기 위해 알아보았다.
우선 환경 변수를 주입하는 방법을 간단하게 알아보자.
docker compose를 사용하여 환경 변수 설정 방법
크게는 docker-compose 파일을 이용하는 방법과 CLI를 사용하는 방법이 있다.
파일로 작성
- .env 파일 작성
- 키-값 쌍의 여러 환경 변수를 한 번에 주입하기 용이하다. 작성된 .env 파일은 프로젝트 폴더의 루트 폴더에 위치해야 된다.
- compose 파일 내의 속성 이용
- env_file 혹은 environment 속성을 이용하여 환경 변수 주입이 가능하다. 간단한 예시는 아래와 같다.
-
# env_file 속성 이용 # required가 false면 파일이 존재하지 않아도 이를 무시한다. env_file: - path: ./default.env required: true # default - path: ./override.env required: false # environment 속성 이용 services: webapp: image: my-webapp-image environment: - DEBUG=${DEBUG}
- shell에서 주입
- 사용자가 별도의 환경 변수 주입이 없을 시 shell 상의 환경 변수를 주입받을 수 있다.
CLI 방식
- "--env-file" 커멘드 이용
- 환경 변수 파일 작성 후 해당 커멘드를 이용하여 직접 주입이 가능하다.
$ docker-compose --env-file ./config/.env.dev up
- docker-compose run의 --env (-e) 옵션을 이용하여 직접 변수를 주입
- 해당 커멘드를 이용하여 직접 키-값의 환경 변수를 주입합니다.
-
$ docker compose run -e DEBUG=1 web python console.py
docker-compose 이용 시 환경 변수 주입 방법에 대한 설명은 끝났다.
위와 같이 다양한 환경 변수 주입 방법을 이용하면 컨테이너 구동 시 혼란을 발생시킬 수 있다.
이 부분에 대해서는 미리 정의된 우선순위에 의해서 예측을 가능하게 하며 혼란이 야기될 수 없도록 하고 있다.
환경 변수 우선 순위
우선순위가 가장 높은 것부터 가장 낮은 순으로 나열하면 아래와 같다.
- CLI 안에서 docker-compose run의 --env (-e) 옵션을 이용하여 직접 변수를 주입
- shell에서 주입
- compose 파일에서 environment 속성을 이용
- CLI 안에서 "--env-file" 커멘드 이용
- compose 파일에서 env_file 속성을 이용
- 프로젝트 폴더 안에 .env 파일 작성
- Dockerfile 내부에 ARG 혹은 ENV로 세팅되어 있는 변수 (단, environment, env_file, run --env 중 하나 이상이 세팅되어 있어야지 평가됨)
아래 이미지는 예를 들어 각 환경 변수가 중복되어 설정되어 있을 시 우선순위 비교를 표현한 것이다.
만약 환경 변수로 "TAG"라는 환경 변수를 주입 시 각 방법들을 비교한 것이다.
컨테이너를 구동 시 환경 변수를 필수로 필요하다. 열심히 만든 컨테이너 환경을 잘못된 환경 변수 주입으로 의도하지 않게 동작을 안 하게 하려면 환경 변수의 우선순위 정도는 알아두면 컨테이너 운영에 있어 혼동을 줄일 수 있을 것이라 생각이 든다.