일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 비주얼 스튜디오 코드
- NPM
- ES6
- Let's Encrypt
- Linux
- Express
- Certbot
- javascript
- 파이썬
- Schema Registry
- 함수형프로그래밍
- Generics
- MSK
- node.js
- python
- vscode
- docker
- html
- 알고리즘
- V8
- nestjs
- GIT
- https
- ChatGPT
- 자료구조
- Functional Programming
- typescript
- nodeJS
- MSA
- stream
- Today
- Total
JangBaGeum.gif
[Docker] docker-compose 사용 시 환경 변수 우선 순위 본문
여러 컨테이너를 구동 시 동일한 환경 변수를 이용할 때, 혹은 한 컨테이너에 대해 상황에 따라 다른 환경 변수를 동적으로 주입해 줘야 할 때 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"라는 환경 변수를 주입 시 각 방법들을 비교한 것이다.
컨테이너를 구동 시 환경 변수를 필수로 필요하다. 열심히 만든 컨테이너 환경을 잘못된 환경 변수 주입으로 의도하지 않게 동작을 안 하게 하려면 환경 변수의 우선순위 정도는 알아두면 컨테이너 운영에 있어 혼동을 줄일 수 있을 것이라 생각이 든다.