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-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/
답변
호스트 머신 환경 변수를 도커 컨테이너에 파이프하는 방법에 대한 좋은 해킹이 있습니다.
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 컨테이너 서비스 기반 애플리케이션의 비밀을 관리하는 방법 블로그 게시물을 참조하십시오 .