Docker-Compose 환경 변수 설정하기

yong·2025년 6월 26일

SW 모빌리티 스쿨

목록 보기
7/11

환경 변수 삽입 및 관리

환경 변수를 다루는 방법

1. Docker-Compose 파일에 직접 입력

배포용 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

2. Shell 환경 변수 활용

  • 환경 변수 등록 : export MYSQL_ROOT_PASSWORD=pw
version: "3.8"
services: 
  mysql:
    image: mysql:8
    restart: unless-stopped
    ports: 
      - 3306:33
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
  • 실제 내용 확인 : docker-compose convert convert가 없는 명령어라고 해서 docker compose config 명령어를 사용하니 Docker Compose 설정을 정상적으로 확인할 수 있었다.

3. 환경 변수 파일로 생성

배포용 Compose 파일에 환경 변수를 하나하나 다 적어 넣거나 매번 쉘에서 변수로 직접 선언하는 방법은 다소 비효율적이므로 필요한 환경 변수 항목들만 골라내여 별도의 파일로 구성해둔다면 환경 변수 관리를 보다 효율적으로 할 수 있다.

  • Docker Compose에서 환경 변수 정보들을 떼어 별도의 파일로 구성할 때 가장 간편한 방법은 Compose 파일이 위치한 동일한 경로에 .env 파일을 따로 구성하는 것
  • .env 파일을 이용하는 방식은 간편하지만 Docker Compose에서 docker compose up 명령을 수행할 때에만 활용이 가능

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

4. Dockerfile에 환경 변수를 직접 삽입

환경 변수를 yaml이나 별도의 외부 파일에 담아두지 않고자 하는 경우 Dockerfile에 ARG 또는 ENV를 이용하여 환경 변수를 직접 삽입한 뒤 이미지를 빌드해서 사용한다.

FROM mysql:8
ENV MYSQL_ROOT_PASSWORD password

우선 순위

  1. docker-compose 파일에 직접 입력한 값
  2. Shell 환경 변수로 등록한 값
  3. 환경 변수 파일로 입력한 값(.env)
  4. Dockerfile을 이용해서 삽입한 값

한계점

Docker Compose에서의 환경 변수 관리 방법에는 모든 정보가 평문으로 저장된다는 단점이 있다. 중요한 정보가 평문 상태로 호스트에 남아있도록 하는 것은 보안 측면에서 결코 바람직하지 않기 때문에 운영 환경에서는 다음과 같은 방식으로 보안을 강화한다.

  • 외부에 노출되지 않는 private registry를 구축한 뒤 보안 정보가 포함된 전용 이미지를 빌드하여 운영 (이 경우에는 보안 정보가 이미지의 특정 레이어에 남아있게 되므로 이미지와 레지스트리 관리에 신중해야 함)
  • Kubernetes나 Docker-swarm 등 컨테이너 오케스트레이션 도구에서는 이러한 보안 정보를 조금 더 안전히 다룰 수 있는 Secret을 제공하며 AWS, Azure 같은 클라우드 서비스 제공자들이 지원하는 컨테이너 인스턴스들 역시 환경 변수를 설정할 때 Secret기능을 제공해줌
  • 더욱 강화된 형태의 보안이 필요하면 HashiCorp Vault 같은 보안 솔루션을 사용
profile
꿈틀꿈틀

0개의 댓글