들어가며

현재 예전에 진행했었던 프로젝트 시스템 구성을 도커 컨테이너 환경으로 전환하는 과정에 있는데요.

express 서버 구성용 도커 이미지를 생성하는 과정에서 분명 환경 변수 파일이 저장되어 있는 디렉토리(envs) 또한 복사해 가도록 명령 구성을 했습니다.

express 서버 컨테이너의 bash 창에 접근해 ls 명령을 실행해 현재 위치에 존재하는 디렉토리 및 파일 목록을 확인했는데요. envs 디렉토리가 존재하는 것이 확인되었으나, cd envs 명령과 ls 명령을 실행한 결과 envs 디렉토리 안에는 아무 파일도 존재하지 않는 걸 확인했습니다.

왜 환경변수 파일만 복사되지 않는지 그 이유를 찾지 못했습니다. 계속 헤매는 대신 환경변수 파일을 express 서버 컨테이너에게 전달해줄 다른 방법을 모색했습니다.

그 결과, 환경변수 파일을 생성한 후 docker-compose.yml 파일 작성 시 env_file 값을 추가해 express 서버 컨테이너에 환경변수 파일을 전달하는 방법을 찾게 되었습니다.

이후 동일한 상황이 발생하더라도 헤매지 않도록 글로 남기게 되었습니다.

환경변수 파일로 도커 컨테이너 환경변수 주입

.env 파일을 하나 생성한 후, Compose 파일에 명시된 서비스 안에 env_file 항목을 작성해줍니다.

env_file 항목에 들어가는 값은 .env 파일의 경로입니다.

 

.env

PORT=8080
DB_PORT=3306
DB_USERNAME=root
DB_ROOT_PASSWORD=1234
DB_NAME=sample
NODE_ENV=development

docker-compose.yml

version: "3.8"
services:
  express:
    build:
      context: ./express
    env_file:
      - .env
    container_name: express_server
    ports:
      - 8080:8080
    restart: "unless-stopped"

 

추가적으로, 때로는 각 서비스에 대한 환경변수 파일을 별도로 관리해야 할 수도 있는데요. 이때는 어떻게 해야 하는지 알아보겠습니다.

각 서비스마다 다른 환경변수 파일 반영하기

Compose 파일에 명시된 각 서비스 안에 env_file 항목에 각 서비스 별 .env 파일 위치를 값으로 추가해줍니다.

참고) env_file 항목에는 하나 이상의 .env 파일 추가가 가능합니다.

version: '3.8'
services:
  mysql:
    env_file: # 파일이 여러 개라면 리스트 형태로 삽입합니다.
      - 1.env
      - 2.env
    image: mysql:5.7
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

여러 환경변수 파일을 하나의 서비스에 적용할 때 주의사항이 있습니다.

위와 같이 여러 개의 환경변수 파일을 삽입했는데, 만약 두 파일에 똑같은 변수명으로 서로 다른 값이 들어있다면 삽입된 순서를 기준으로 나중에 삽입된 파일의 변수값이 적용됩니다.

여러 환경변수 파일을 하나의 서비스에 반영할 때에는 환경변수의 중복 여부, 파일 삽입 순서 등에 주의하는 것이 좋습니다.

 

참고

https://seongjin.me/environment-variables-in-docker-compose/ 

 

복사했습니다!