Docker Stack Deploy는 Docker Compose처럼 기본값으로 환경 변수를 확인하지 않습니다.

Docker Stack Deploy는 Docker Compose처럼 기본값으로 환경 변수를 확인하지 않습니다.

다음 예제 파일이 있습니다

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 변수를 전달하는 방법

이를 수행하는 방법에 대한 아주 좋은 설명을 찾을 수 있습니다. 저도 같은 문제가 있었는데 이 방법으로 극복했습니다. 문안 인사

관련 정보