[docker] Docker 컨테이너에 환경 변수를 어떻게 전달합니까?

Docker를 처음 접했고 컨테이너에서 외부 데이터베이스에 액세스하는 방법이 확실하지 않습니다. 연결 문자열을 하드 코딩하는 가장 좋은 방법입니까?

# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string



답변

-e플래그 를 사용하여 환경 변수를 컨테이너에 전달할 수 있습니다 .

시작 스크립트의 예 :

sudo docker run -d -t -i -e REDIS_NAMESPACE='staging' \
-e POSTGRES_ENV_POSTGRES_PASSWORD='foo' \
-e POSTGRES_ENV_POSTGRES_USER='bar' \
-e POSTGRES_ENV_DB_NAME='mysite_staging' \
-e POSTGRES_PORT_5432_TCP_ADDR='docker-db-1.hidden.us-east-1.rds.amazonaws.com' \
-e SITE_URL='staging.mysite.com' \
-p 80:80 \
--link redis:redis \
--name container_name dockerhub_id/image_name

또는 명령 줄에 값 ps등을 표시하지 않으려는 -e경우 =: 없이 값을 지정하면 현재 환경에서 값을 가져올 수 있습니다 .

sudo PASSWORD='foo' docker run  [...] -e PASSWORD [...]

많은 환경 변수가 있고 특히 비밀 변수 인 경우 env 파일을 사용할있습니다 .

$ docker run --env-file ./env.list ubuntu bash

–env-file 플래그는 파일 이름을 인수로 사용하고 각 행이 VAR = VAL 형식으로되어 –env에 전달 된 인수를 모방합니다. 주석 줄 앞에는 # 만 있으면됩니다.


답변

여기에 언급되고 @errata에 언급 된대로 명령에 -e매개 변수를 사용하여 전달할 수 있습니다 .
그러나이 방법의 가능한 단점은 자격 증명이 실행되는 프로세스 목록에 자격 증명이 표시된다는 것입니다.
더 안전하게 보호하려면 구성 파일에 자격 증명을 작성하고 수행 할 수 있습니다 에 언급 한 바와 같이 여기 . 그런 다음 해당 시스템에 액세스 할 수있는 다른 사용자가 자격 증명을 볼 수 없도록 해당 구성 파일의 액세스를 제어 할 수 있습니다.docker run ..

docker run--env-file


답변

컨테이너를 스핀 업하는 방법으로 ‘docker-compose’를 사용하는 경우 실제로 서버에 정의 된 환경 변수를 Docker 컨테이너로 전달하는 유용한 방법이 있습니다.

당신의에서 docker-compose.yml파일의 당신이 기본 게요!-JS 컨테이너와 코드를 보이는 등을 회전하는 가정 해 봅시다 :

hapi_server:
  container_name: hapi_server
  image: node_image
  expose:
    - "3000"

도커 프로젝트가있는 로컬 서버에 hapi-js 컨테이너에 전달하려는 환경 변수 ‘NODE_DB_CONNECT’가 있고 새 이름을 ‘HAPI_DB_CONNECT’로 지정한다고 가정 해 봅시다. 그런 다음 docker-compose.yml파일에서 로컬 환경 변수를 컨테이너에 전달하고 다음과 같이 이름을 바꿉니다.

hapi_server:
  container_name: hapi_server
  image: node_image
  environment:
    - HAPI_DB_CONNECT=${NODE_DB_CONNECT}
  expose:
    - "3000"

컨테이너의 모든 파일에서 데이터베이스 연결 문자열을 하드 코딩하는 것을 피하는 데 도움이되기를 바랍니다.


답변

을 사용하면 docker-composedocker-compose.yml 및 이후에 docker-compose이미지를 빌드하기 위해 호출 된 모든 Dockerfile에서 env 변수를 상속 할 수 있습니다. 이것은 Dockerfile RUN명령이 환경에 특정한 명령을 실행해야 할 때 유용 합니다.

(쉘은 RAILS_ENV=development이미 환경에 존재합니다)

docker-compose.yml :

version: '3.1'
services:
  my-service:
    build:
      #$RAILS_ENV is referencing the shell environment RAILS_ENV variable
      #and passing it to the Dockerfile ARG RAILS_ENV
      #the syntax below ensures that the RAILS_ENV arg will default to
      #production if empty.
      #note that is dockerfile: is not specified it assumes file name: Dockerfile
      context: .
      args:
        - RAILS_ENV=${RAILS_ENV:-production}
    environment:
      - RAILS_ENV=${RAILS_ENV:-production}

도커 파일 :

FROM ruby:2.3.4

#give ARG RAILS_ENV a default value = production
ARG RAILS_ENV=production

#assign the $RAILS_ENV arg to the RAILS_ENV ENV so that it can be accessed
#by the subsequent RUN call within the container
ENV RAILS_ENV $RAILS_ENV

#the subsequent RUN call accesses the RAILS_ENV ENV variable within the container
RUN if [ "$RAILS_ENV" = "production" ] ; then echo "production env"; else echo "non-production env: $RAILS_ENV"; fi

이 방법으로 파일이나 docker-compose build/ up명령 에서 환경 변수를 지정할 필요가 없습니다 .

docker-compose build
docker-compose up


답변

-e환경 변수를 설정 하려면 또는 –env 값을 사용하십시오 (기본값 []).

시작 스크립트의 예 :

 docker run  -e myhost='localhost' -it busybox sh

명령 행에서 여러 환경을 사용하려면 모든 환경 변수 전에 -e플래그를 사용하십시오 .

예:

 sudo docker run -d -t -i -e NAMESPACE='staging' -e PASSWORD='foo' busybox sh

참고 : 컨테이너 이름은 환경 변수가 아닌 환경 변수 뒤에 있어야합니다.

많은 변수를 설정해야하는 경우 --env-file플래그를 사용하십시오.

예를 들어

 $ docker run --env-file ./my_env ubuntu bash

다른 도움이 필요하면 Docker 도움말을 살펴보십시오.

 $ docker run --help

공식 문서 :
https://docs.docker.com/compose/environment-variables/


답변

호스트 머신 환경 변수를 도커 컨테이너에 파이프하는 방법에 대한 좋은 해킹이 있습니다.

env > env_file && docker run --env-file env_file image_name

모든 호스트 시스템 ENV 변수를 env > env_file덤프 하여 실행중인 컨테이너에서 액세스 할 수 있으므로이 기술을 매우 신중하게 사용하십시오 .env_file


답변

Amazon AWS ECS / ECR의 경우 프라이빗 S3 버킷을 통해 환경 변수 ( 특히 비밀 )를 관리해야합니다 . Amazon S3 및 Docker를 사용하여 Amazon EC2 컨테이너 서비스 기반 애플리케이션의 비밀을 관리하는 방법 블로그 게시물을 참조하십시오 .