답변:
-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에 전달 된 인수를 모방합니다. 주석 줄 앞에는 # 만 있으면됩니다.
export PASSWORD=foo
대신 수행하면 변수가 docker run
환경 변수로 전달 되어 docker run -e PASSWORD
작동합니다.
여기에 언급되고 @errata에 언급 된대로 명령에 -e
매개 변수를 사용하여 전달할 수 있습니다 .
그러나이 방법의 가능한 단점은 자격 증명이 실행되는 프로세스 목록에 자격 증명이 표시된다는 것입니다.
더 안전하게 보호하려면 구성 파일에 자격 증명을 작성하고 수행 할 수 있습니다 에 언급 한 바와 같이 여기 . 그런 다음 해당 시스템에 액세스 할 수있는 다른 사용자가 자격 증명을 볼 수 없도록 해당 구성 파일의 액세스를 제어 할 수 있습니다.docker run ..
docker run
--env-file
--env-file
를 사용할 때, --env
당신의 ENV 값이 인용 될 것입니다 / 당신이 사용하고있는 쉘 어떤 표준 의미로 이스케이프 만 사용하는 경우 --env-file
값을 서로 다른 것 컨테이너 내부에 얻을 것이다. docker run 명령은 파일을 읽고 매우 기본적인 구문 분석을 수행하고 값을 컨테이너로 전달합니다. 이는 쉘의 동작 방식과 동일하지 않습니다. 많은 --env
항목을 로 변환하는 경우 알아야 할 작은 정보 --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-compose
docker-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/
ubuntu bash
합니까? 우분투로 만든 이미지를 기본 이미지 또는 모든 이미지에 적용합니까?
-e
오래 전 논쟁 후에 컨테이너 이름을 넣는 것에 대해 조금 읽었 으면 좋겠다 . 그들이이 필요했다 왜 난 ... 이해하기 시작할 수 없습니다
Amazon AWS ECS / ECR의 경우 프라이빗 S3 버킷을 통해 환경 변수 ( 특히 비밀 )를 관리해야합니다 . Amazon S3 및 Docker를 사용하여 Amazon EC2 컨테이너 서비스 기반 애플리케이션의 비밀을 관리하는 방법 블로그 게시물을 참조하십시오 .
env.sh
로컬에 환경 변수가 있고 컨테이너가 시작될 때 환경 변수 를 설정하려는 경우 시도 할 수 있습니다
COPY env.sh /env.sh
COPY <filename>.jar /<filename>.jar
ENTRYPOINT ["/bin/bash" , "-c", "source /env.sh && printenv && java -jar /<filename>.jar"]
이 명령은 bash 쉘 ( source
bash 명령 이므로 bash 쉘을 원합니다)로 컨테이너를 시작하고 env.sh
파일을 환경 변수를 설정하고 jar 파일을 실행합니다.
env.sh
같은 외모,
#!/bin/bash
export FOO="BAR"
export DB_NAME="DATABASE_NAME"
printenv
실제 소스 명령이 작동하는지 테스트하기 위해 명령을 추가했습니다 . source 명령이 제대로 작동하는지 확인하거나 환경 변수가 docker logs에 나타날 때이를 제거해야합니다.
--env-file
arg를 지정하는 옵션이없는 곳 docker run
입니다. 예를 들어 Google 앱 엔진을 사용하여 애플리케이션을 배포하고 컨테이너 내에서 실행되는 앱에 도커 컨테이너 내에 설정된 환경 변수가 필요한 경우 docker run
명령 을 제어 할 수 없으므로 환경 변수를 설정하는 직접적인 방법이 없습니다. . 이 경우 KMS를 사용하여 env 변수를 해독하고 env 변수 env.sh
를 설정하기 위해 소스에 추가 할 수있는 스크립트를 만들 수 있습니다.
.
정기적으로 sh
사용 가능한 POSIX (도트) 명령을 사용할 수 있습니다 source
. ( source
것과 동일 .
)
jq를 사용하여 env를 JSON으로 변환 :
env_as_json=`jq -c -n env`
docker run -e HOST_ENV="$env_as_json" <image>
여기에는 jq 버전 1.6 이상 이 필요합니다
이것은 본질적으로 Dockerfile에서와 같이 호스트 env를 json으로 설정합니다.
ENV HOST_ENV (all env from the host as json)
docker run -e HOST_ENV="$env_as_json" <image>
합니까? : ? 필자의 경우 Docker는 docker args로 전달 될 때 변수 또는 하위 셸 ( ${}
또는 $()
)을 해결하지 않는 것 같습니다 . 예를 들면 A=123 docker run --rm -it -e HE="$A" ubuntu
다음과 같습니다 root@947c89c79397:/# echo $HE root@947c89c79397:/#
. 그 컨테이너 안에서 : .... HE
변수가 만들지 않습니다.
-e 플래그와 $를 사용하여 머신 환경 변수를 호스팅 할 수도 있습니다.
docker run -it -e MG_HOST=$MG_HOST -e MG_USER=$MG_USER -e MG_PASS=$MG_PASS -e MG_AUTH=$MG_AUTH -e MG_DB=$MG_DB -t image_tag_name_and_version
이 방법을 사용하면 내 경우에 주어진 이름으로 env 변수를 자동으로 설정합니다 (MG_HOST, MG_USER)
파이썬을 사용하는 경우 도커 내에서 이러한 envment 변수에 액세스 할 수 있습니다
import os
host,username,password,auth,database=os.environ.get('MG_HOST'),os.environ.get('MG_USER'),os.environ.get('MG_PASS'),os.environ.get('MG_AUTH'),os.environ.get('MG_DB')
docker run --rm -it --env-file <(bash -c 'env | grep <your env data>')
a에 저장된 데이터를 grep하여 .env
Docker에 전달 하는 방법은 안전하지 않은 상태로 저장되지 않으므로 docker history
키를 보거나 잡을 수 없습니다 .
다음 .env
과 같이 AWS에 많은 것들이 있다고 가정 해보십시오 .
AWS_ACCESS_KEY: xxxxxxx
AWS_SECRET: xxxxxx
AWS_REGION: xxxxxx
```docker run --rm -it --env-file <(bash -c 'env | grep AWS_')으로 docker를 실행하면 모든 것을 가져 와서 컨테이너 내에서 액세스 할 수 있도록 안전하게 전달합니다.