배포용 Compose 파일의 services 안에 environment라는 속성에 변수이름:값의 형태로 넣어주면 된다.
ex) MySQL의 경우 MYSQL_ROOT_PASSWORD라는 변수 값이 반드시 필요하므로 이 값을 환경 변수로 지정해보기
version: "3.8"
services:
mysql:
image: mysql:8
restart: unless-stopped
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: password
export MYSQL_ROOT_PASSWORD=pwversion: "3.8"
services:
mysql:
image: mysql:8
restart: unless-stopped
ports:
- 3306:33
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
docker compose config 명령어를 사용하니 Docker Compose 설정을 정상적으로 확인할 수 있었다.
배포용 Compose 파일에 환경 변수를 하나하나 다 적어 넣거나 매번 쉘에서 변수로 직접 선언하는 방법은 다소 비효율적이므로 필요한 환경 변수 항목들만 골라내여 별도의 파일로 구성해둔다면 환경 변수 관리를 보다 효율적으로 할 수 있다.
env 파일 문법
변수명=값 의 형태로 입력실습
# 이전에 만든 환경변수 삭제
unset MYSQL_ROOT_PASSWORD
# docker-compose 파일과 동일한 위치에 .env 파일을 생성하고 작성
MYSQL_ROOT_PASSWORD=password
# 확인
docker compose config
실행 시 파일 지정하기
경우에 따라서 여러 개의 환경변수 파일로 나누는 일이 필요할 수 있는데 개발 환경(dev)과 운영 환경(prod)에 따라 주입해야 할 값이 다른 경우에는 각각의 환경에 맞는 별도의 env_file을 구성한 뒤 배포할 때 —env-file 파일경로 플래그로 불러올 파일을 직접 지정할 수 있음
# 환경변수 파일 생성
# ./config/.env.dev 파일
MYSQL_ROOT_PASSWORD=password_dev
# ./config/.env.prod 파일
MYSQL_ROOT_PASSWORD=password_prod
# 적용
docker-compose --env-file ./config/.env.dev config
서비스 별로 다른 환경 변수 파일 사용하기
각 서비스의 env_file 속성에 환경 변수 파일의 경로를 배열로 나열
services:
mysql:
env_file:
- a.env
- b.env
환경 변수를 yaml이나 별도의 외부 파일에 담아두지 않고자 하는 경우 Dockerfile에 ARG 또는 ENV를 이용하여 환경 변수를 직접 삽입한 뒤 이미지를 빌드해서 사용한다.
FROM mysql:8
ENV MYSQL_ROOT_PASSWORD password
Docker Compose에서의 환경 변수 관리 방법에는 모든 정보가 평문으로 저장된다는 단점이 있다. 중요한 정보가 평문 상태로 호스트에 남아있도록 하는 것은 보안 측면에서 결코 바람직하지 않기 때문에 운영 환경에서는 다음과 같은 방식으로 보안을 강화한다.