10.3.환경 변수와 비밀값을 이용해 설정 주입하기

오버라이드 파일을 사용해 환경별로 다른 설정값을 적용

비밀값(secrets)

  • 도커 컴포즈, 도커 스웜, 쿠버네티스에서 모두 지원하는 기능으로, 설정값을 주입하기에 매우 유용한 기능
  • source: 원본 위치, 컨테이너 런타임이 비밀값의 값을 읽어 오는 곳
  • target: 대상 위치, 컨테이너 안에서 비밀값이 위치할 경로
# docker-compose.yml

001) services:
002)   todo-web:
003)     image: diamol/ch06-todo-list
004)     secrets:
005)       - source: todo-db-connection
006)         target: /app/config/secrets.json
  1. 005: 이 이름으로 정의된 비밀값이 해당 컴포즈 파일에 정의되어 있어야 함.
  2. 006: 컨테이너 속 경로 /app/config/secrets.json 파일로 전달된다. 이 경로는 애플리케이션이 설정 파일을 찾는 경로이기도 하다.

오버라이드

  • 개발 환경 용 오버라이드 파일로 개발 환경을 위한 추가 설정과 비밀값을 정의할 수 있다.
  • environment: 컨테이너 안에서만 사용되는 환경 변수, 설정값을 전달하는 방법 중 가장 간단한 방법
  • env_file: 텍스트 파일의 경로를 값으로 받는다.
  • secrets: 컴포즈 파일의 최상위 프로퍼티. 비밀값 정의
# docker-compose-dev.yml

001) services:
002)   todo-web:
003)     ports:
004)       - 8089:80
005)     environment:
006)       - Database:Provider=Sqlite
007)     env_file:
008)       - ./config/logging.debug.env
009) 
010) secrets:
011)   todo-db-connection:
012)     file: ./config/empty.json
  1. 005~006: 이 환경 변수 값을 적용하면 애플리케이션이 데이터베이스로 파일 데이터베이스인 Sqlite 를 사용한다.
  2. 007~008: 이 파일에 정의된 환경 변수가 컨테이너에 적용된다.
  3. 010~012: todo-db-connection의 실제 값 혹은 경로가 정의된다.

호스트 컴퓨터의 환경 변수 값을 컨테이너에 전달

  • 컴포즈 파일을 수정하지 않고 설정값을 변경할 수 있기 때문에 애플리케이션의 이식성이 향상된다.
  • 달러 기호가 붙은 중괄호 부분이 괄호 안에 적힌 이름의 환경 변수 값으로 치환된다.
# docker-compose-test.yml

001) services:
002)   todo-web:
003)     ports:
004)       - "${TODO_WEB_PORT}:80"
005)     environment:
006)       - Database:Provider=Postgres
007)     env_file:
008)       - ./config/logging.information.env
009)     networks:
010)       - app-net
011) 
012)   todo-db:
013)     image: diamol/postgres:11.5
014)     ports:
015)       - "${TODO_DB_PORT}:5432"
016)     networks:
017)       - app-net
018) 
019) networks:
020)   app-net:
021)     name: todo-test
022) 
023) secrets:
024)   todo-db-connection:
025)     file: ./config/secrets.json
  1. 004: 도커 컴포즈를 실행 중인 컴퓨터의 환경 변수 TODO_WEB_PORT의 값이 8877이었 다면 ports 프로퍼티의 값이 "8877:80"이 된다.

env 파일 사용

  • env 파일이 컴포즈 애플리케이션의 디렉터리에 존재하면 자동으로 읽어 들여 적용된다.
  • 도커 컴포즈는 env 파일만을 환경 파일로 간주하기 때문에 환경 파일 여러 개를 만들어 바꿔 가면서 사용할 수 없다.
# 컨테이너 설정값 - 공개 포트
TODO_WEB_PORT=8877
TODO_DB_PORT=5432

# 도커 컴포즈 실행 옵션 - 컴포즈 파일 지정, 프로젝트 이름
COMPOSE_PATH_SEPARATOR=;
COMPOSE_FILE=docker-compose.yml;docker-compose-test.yml
COMPOSE_PROJECT_NAME=todo_ch10

정리

environment * 간단하고 컴포즈 파일의 가독성이 좋다. * 평문 텍스트로 작성되기 때문에 API 키나 데이터베이스 접속 정보 같은 민감한 정보에는 사용하지 않는 편이 좋다.

비밀값(secrets) * 모든 컨테이너 런타임에서 적용 가능하고 민감한 정보가 유출될 우려도 없기 때문에 유연성 면에서 가장 뛰어나다. * 비밀값의 실제 값은 로컬 파일 시스템에 저장할 수도 있고, 도커 스웜이나 쿠버네티스 클러스터에 저장할 수도 있다. * 실제값이 어디에 저장되든 애플리케이션이 실행될 때 컨테이너 속의 특정한 파일로 전달된다.

env_file * 서비스 간에 공유하는 설정이 많은 경우에 유용하다. * 설정값을 파일에 저장한 다음 이 파일의 경로로 읽어들여 사용 * 컴포즈가 로컬에 위치한 파일을 읽어 각 설정값을 지정해 주기 때문에 원격 컴퓨터에서 실행 중인 도커 엔진을 다룰 때도 로컬 컴퓨터의 설정값을 적용할 수 있다.

.env * 환경을 막론하고 기본 설정을 지정할 때 유용하다.

links

social