docker-compose.yml 내에서 docker-compose up시 전달 된 값으로 env 변수를 사용할 수 있기를 원합니다. 이것은 예입니다. 나는 오늘 자신의 스크립트를 감싸는 기본 docker run 명령 으로이 작업을 수행하고 있습니다. 그러한 bash 래퍼없이 compose로 달성 할 수있는 방법이 있습니까?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
답변
- with 환경 변수
template.yml
인을 만듭니다docker-compose.yml
. - 환경 변수가 ‘env.sh’파일에 있다고 가정하십시오.
- 아래 코드를 sh 파일에 넣고 실행하십시오.
소스 env.sh; rm -rf docker-compose.yml; envsubst < “template.yml”> “docker-compose.yml”;
docker-compose.yml
올바른 환경 변수 값으로 새 파일 이 생성됩니다.
샘플 template.yml 파일 :
oracledb:
image: ${ORACLE_DB_IMAGE}
privileged: true
cpuset: "0"
ports:
- "${ORACLE_DB_PORT}:${ORACLE_DB_PORT}"
command: /bin/sh -c "chmod 777 /tmp/start; /tmp/start"
container_name: ${ORACLE_DB_CONTAINER_NAME}
샘플 env.sh 파일 :
#!/bin/bash
export ORACLE_DB_IMAGE=<image-name>
export ORACLE_DB_PORT=<port to be exposed>
export ORACLE_DB_CONTAINER_NAME=ORACLE_DB_SERVER
답변
DOCKER 솔루션 :
docker-compose 1.5 이상에서 변수 대체를 활성화 한 것 같습니다 : https://github.com/docker/compose/releases
최신 Docker Compose를 사용하면 작성 파일에서 환경 변수에 액세스 할 수 있습니다. 따라서 환경 변수를 소싱 한 다음 Compose를 다음과 같이 실행할 수 있습니다.
set -a
source .my-env
docker-compose up -d
그런 다음 $ {VARIABLE}을 사용하여 docker-compose.yml에서 변수를 참조 할 수 있습니다.
db:
image: "postgres:${POSTGRES_VERSION}"
그리고 여기 문서에서 가져온 더 많은 정보가 있습니다 : https://docs.docker.com/compose/compose-file/#variable-substitution
이 구성으로 docker-compose를 실행하면 Compose는 셸에서 POSTGRES_VERSION 환경 변수를 찾아 그 값을 대체합니다.이 예에서 Compose는 구성을 실행하기 전에 이미지를 postgres : 9.3으로 해석합니다.
환경 변수가 설정되지 않은 경우 작성은 빈 문자열로 대체됩니다. 위의 예에서 POSTGRES_VERSION이 설정되지 않은 경우 이미지 옵션의 값은 postgres :입니다.
$ VARIABLE 및 $ {VARIABLE} 구문이 모두 지원됩니다. $ {VARIABLE-default} 및 $ {VARIABLE / foo / bar}와 같은 확장 된 셸 스타일 기능은 지원되지 않습니다.
구성 값에 리터럴 달러 기호를 넣어야하는 경우 더블 달러 기호 ($$)를 사용하십시오.
그리고이 풀 요청 에이 기능이 추가되었다고 생각합니다 : https://github.com/docker/compose/pull/1765
BASH 솔루션 :
Docker의 환경 변수 지원에 문제가있는 사람들이 있습니다. Docker에서 환경 변수를 처리하는 대신 bash와 같은 기본으로 돌아가 봅시다! bash 스크립트와 .env
파일을 사용하는보다 유연한 방법이 있습니다.
.env 파일 예 :
EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM
# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml
그런 다음이 bash 스크립트를 동일한 디렉토리에서 실행하십시오.이 디렉토리는 모든 것을 올바르게 배치해야합니다.
#!/bin/bash
docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d
일반적인 bash 구문을 사용하여 작성 파일에서 env 변수를 참조하십시오 (예 : 파일 에서 ${SECRET_KEY}
삽입 ).SECRET_KEY
.env
(가) 주 COMPOSE_CONFIG
내에서 정의 .env
파일 내 bash는 스크립트에 사용되는,하지만 당신은 그냥 쉽게 교체 할 수 있습니다 {$COMPOSE_CONFIG}
과 my-compose-file.yml
bash는 스크립트.
또한 모든 컨테이너의 이름을 “myproject”접두어로 지정하여이 배포에 레이블을 지정했습니다. 원하는 이름을 사용할 수 있지만 나중에 쉽게 참조 할 수 있도록 컨테이너를 식별하는 데 도움이됩니다. 컨테이너가 상태가없는 것으로 가정하면이 스크립트는 .env 파일 매개 변수 및 작성 YAML 파일에 따라 컨테이너를 빠르게 제거하고 재배치합니다.
업데이트이
답변은 꽤 인기가있는 것으로 보이므로 Docker 배포 워크 플로에 대해보다 자세하게 설명하는 블로그 게시물을 작성했습니다. http://lukeswart.net/2016/03/lets-deploy-part-1/ 추가하면 도움이 될 수 있습니다 nginx 구성, LetsEncrypt 인증서 및 연결된 컨테이너와 같은 배포 구성에 대한 더 복잡한.
답변
docker-compose는 이제 file의 기본 환경 변수 를 기본적으로 지원하는 것으로 보입니다 .
이름이 지정된 파일로 변수를 선언하기 .env
만하면 docker-compose.yml에서 변수를 사용할 수 있습니다.
예를 들어, .env
내용이있는 파일의 경우 :
MY_SECRET_KEY=SOME_SECRET
IMAGE_NAME=docker_image
변수 내부에 액세스 docker-compose.yml
하거나 컨테이너에 전달할 수 있습니다.
my-service:
image: ${IMAGE_NAME}
environment:
MY_SECRET_KEY: ${MY_SECRET_KEY}
답변
다음은 컨테이너 내부의 docker-compose 3.x Set 환경 변수에 적용됩니다.
방법-1 직선 방법
web:
environment:
- DEBUG=1
POSTGRES_PASSWORD: 'postgres'
POSTGRES_USER: 'postgres'
방법-2 “.env”파일
docker-compose.yml과 동일한 위치에 .env 파일을 만듭니다.
$ cat .env
TAG=v1.5
POSTGRES_PASSWORD: 'postgres'
작성 파일은
$ cat docker-compose.yml
version: '3'
services:
web:
image: "webapp:${TAG}"
postgres_password: "${POSTGRES_PASSWORD}"
답변
볼륨에 환경 변수를 사용하는 경우 다음이 필요합니다.
-
만들 .env의 들어있는 동일한 폴더에 파일을
docker-compose.yaml
파일을 -
.env
파일 에서 변수를 선언 하십시오.HOSTNAME=your_hostname
-
변경
$hostname
하기${HOSTNAME}
에서docker-compose.yaml
파일proxy: hostname: ${HOSTNAME} volumes: - /mnt/data/logs/${HOSTNAME}:/logs - /mnt/data/${HOSTNAME}:/data
물론 각 빌드에서 다음과 같이 동적으로 수행 할 수 있습니다.
echo "HOSTNAME=your_hostname" > .env && sudo docker-compose up
답변
가장 좋은 방법은 docker-compose.yml
파일 외부에 환경 변수를 지정하는 것 입니다. env_file
설정 을 사용 하고 동일한 줄에서 환경 파일을 정의 할 수 있습니다. 그런 다음 docker-compose up을 다시 수행하여 새로운 환경 변수로 컨테이너를 다시 만들어야합니다.
내 docker-compose.yml의 모양은 다음과 같습니다.
services:
web:
env_file: variables.env
참고 : docker-compose는 env 파일의 각 줄이
VAR=VAL
형식 이어야 합니다. 파일export
내부에서 사용하지 마십시오.env
. 또한.env
파일은 docker-compose 명령이 실행되는 폴더에 있어야합니다.
답변
당신은 아직 … 할 수 없습니다. 그러나 이것은 대안입니다. docker-composer.yml 생성기처럼 생각하십시오.
https://gist.github.com/Vad1mo/9ab63f28239515d4dafd
기본적으로 변수를 대체 할 쉘 스크립트입니다. 또한 Grunt 작업을 사용하여 CI 프로세스가 끝나면 docker compose 파일을 작성할 수 있습니다.