Skip to content

docker container env workaround(envsubst)

younguna edited this page Nov 13, 2019 · 1 revision

docker container env workaround

Docker 이미지 내부에 사용하는 conf에 .env의 환경변수의 domain을 넣고싶은 경우 혹은 이와 비슷한 상황의 경우

# docker-compose.yml
version: "3"

services:
  nginx
    env_file:
      - ./.env
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

# .env
NGINX_SERVER_NAME=trycatch.growd.me

# default.conf
server {
  server_name ${NGINX_SERVER_NAME}
}

위의 경우 콘테이너 내부적으로 환경변수를 유지하지만 nginx가 사용하는 default.conf파일에 환경변수를 사용하는 ${변수명}을 사용해도 당연히 적용이 되지않고 도커이미지가 기본제공하는 기본환경변수적용도 이루어지지 않는다.

solution

# docker-compose.yml
version: "3"

services:
  nginx
    env_file:
      - ./.env
    volumes:
      - ./nginx/default.conf.template:/etc/nginx/conf.d/default.conf.template
    command: /bin/bash -c "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

# .env
NGINX_SERVER_NAME=trycatch.growd.me

# default.conf.template
server {
  server_name ${NGINX_SERVER_NAME}
}
  • docker 공식 nginx 이미지 페이지에서 제공하는 workaround 방법이다.
  • template을 생성하고 envsubt로 env들을 치환한다.
  • 치환하여 실제로 사용하는 default.conf파일을 생성하여 올바른 디렉토리에 위치시킨다.
  • 실제로 이미지가 돌아가게끔 하는 nginx -g 'daemon off;'를 실행하게끔 한다.
Clone this wiki locally