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

2022. 11. 10. 18:10·Docker

들어가며

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

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/ 

 

'Docker' 카테고리의 다른 글

Docker Volume 및 Docker 로 MySql 컨테이너 설정, 데이터 영구 저장  (2) 2022.12.01
로컬에서 Docker 를 이용한 Express 서버 어플리케이션 개발  (0) 2022.12.01
계속해서 restart 상태인 컨테이너 디버깅하기  (0) 2022.11.10
[Error] unable to start container process: exec: "bash"  (0) 2022.11.10
Docker Compose 개념과 사용하는 이유  (0) 2022.11.09
'Docker' 카테고리의 다른 글
  • Docker Volume 및 Docker 로 MySql 컨테이너 설정, 데이터 영구 저장
  • 로컬에서 Docker 를 이용한 Express 서버 어플리케이션 개발
  • 계속해서 restart 상태인 컨테이너 디버깅하기
  • [Error] unable to start container process: exec: "bash"
rondeveloper
rondeveloper
  • rondeveloper
    Ron's learning record
    rondeveloper
  • 전체
    오늘
    어제
    • 분류 전체보기 (102)
      • k8s (2)
      • AWS (1)
      • 리눅스 (5)
      • Docker (8)
      • 라이브러리 & 프레임워크 (14)
        • React (2)
        • NestJS (8)
        • Spring (0)
        • Django (3)
        • FastAPI (1)
      • 웹 (2)
        • Nginx (1)
      • 프로그래밍 언어 (29)
        • HTML (0)
        • CSS (0)
        • JavaScript (21)
        • Python (3)
        • Node.js (0)
        • TypeScript (4)
        • Java (1)
      • Today I learned (9)
      • 알고리즘 (9)
        • 백준 (0)
        • 프로그래머스 (8)
        • 개념 (1)
      • 티끌모아 태산 (5)
        • 하루에 영단어 하나씩 (5)
        • 독서 (0)
      • 시행착오 (3)
      • 데이터베이스 (2)
        • MySQL (0)
      • 컴퓨터 과학 (8)
        • 네트워크 (2)
        • 운영체제 (0)
        • 데이터베이스 (2)
        • 자료구조 (4)
      • 포트폴리오 (4)
        • JJINCAFE IN SEOUL (4)
        • CODEUNICORN (0)
      • 회고 (0)
      • CICD (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    레벨2
    반복문
    프로그래머스
    조인
    FastAPI
    django
    IP 주소
    자바스크립트
    Til
    mysql
    typescript
    리눅스
    Docker
    typeorm
    네트워크
    redis
    생활코딩
    Kubectl
    코딩테스트
    기초
    javascript
    모듈
    iterable
    배열
    Python
    스택
    Kubernetes
    도커
    nestjs
    컨테이너
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
rondeveloper
도커 컨테이너 환경변수 주입
상단으로

티스토리툴바