
다음 예제 파일이 있습니다
docker-compose.yml
version: '3'
services:
web:
image: webapp:${VARIABLE_A:-${VARIABLE_B}}
env.conf
VARIABLE_B=123
VARIABLE_A
의도적으로 설정되지 않았으므로 다시 설정해야 합니다.VARIABLE_B
Docker Compose는 환경 변수의 기본값을 확인할 수 있지만 docker stack deploy
동일한 해결을 수행할 수는 없습니다.
user@laptop:~$ docker compose --env-file ./env.conf convert
name: dockercomposetest
services:
web:
image: webapp:123
networks:
default: null
networks:
default:
name: dockercomposetest_default
user@laptop:~$ env $(cat ./env.conf | xargs) docker stack deploy --compose-file docker-compose.yml stack
Creating service stack_web
failed to create service stack_web:
Error response from daemon:
rpc error:
code = InvalidArgument desc = ContainerSpec: "webapp:${VARIABLE_B}" is not a valid repository/tag
사용할 때 볼 수 있듯이 설정되지 않았기 때문에 기본값으로 설정되어야 하는 환경 변수가 docker stack deploy
감지 되지만 해당 값은 확인되지 않습니다.${VARIABLE_A:-${VARIABLE_B}}
VARIABLE_A
${VARIABLE_B}
123
분명히 webapp은 존재하지 않으며 단지 예일 뿐이지만 위의 오류 출력은 대신 다음과 같아야 합니다.
user@laptop:~$ env $(cat ./env.conf | xargs) docker stack deploy --compose-file docker-compose.yml stack
Creating service stack_web
failed to create service stack_web:
Error response from daemon:
rpc error:
code = InvalidArgument desc = ContainerSpec: "webapp:123" is not a valid repository/tag
왜 이런 일이 발생합니까? 이에 대한 해결 방법이 있나요?
답변1
참고로 moby를 참조하세요.1.13의 docker 스택 배포는 docker-compose up처럼 .env 파일을 로드하지 않습니다.. 구체적으로kinghuang의 코멘트
"개발자들에게 docker-compose 구성을 사용하여 Docker Compose 프로젝트를 docker 스택 배포에 전달하기 전에 사전 처리하도록 했습니다. 다음을 사용하여 한 줄로 이 작업을 수행할 수 있습니다.
docker stack deploy -c <(docker-compose config) stack-name-here
이렇게 하면 .env 처리를 포함한 모든 Docker Compose 기능이 완전히 적용됩니다."
답변2
내가 결국 수행한 해결 방법은 env vars를 교체 docker stack deploy
하는 것입니다 .envsubst
user@laptop:~$ env $(cat ./env.conf | xargs) envsubst < ./docker-compose.yml | docker stack deploy --compose-file - stack
문서에 따르면 --compose-file -
이를 사용하면 docker compose 파일로 사용되므로 stdin
기본적으로 이 작업은 먼저 모든 변수를 해결한 docker-compose.yml
다음 파이프를 사용하여 결과를 전달하는 것입니다.docker stack deploy
답변3
이 문제를 극복할 수 있는 또 다른 좋은 방법이 있습니다. 환경에 추가하려는 모든 변수가 포함된 ".env" 파일을 만들어야 합니다. 예: APP_NAME=Example
. 그런 다음 stack-compose.yml에서 다음과 같이 선언할 수 있습니다.
version: "3.9"
services:
myservice:
env_file:
- .env
그런 다음 다음 명령을 실행해야 합니다.
docker stack config -c stack-compose.yml | docker stack deploy -c - mystackname
그러면 stack_compose.yml의 .env 파일에 선언한 변수가 다음과 같이 삽입됩니다.
version: "3.9"
services:
myservice:
environment:
APP_NAME: "Example"
이 링크에서docker swarm 스택에서 env 변수를 전달하는 방법
이를 수행하는 방법에 대한 아주 좋은 설명을 찾을 수 있습니다. 저도 같은 문제가 있었는데 이 방법으로 극복했습니다. 문안 인사