使用变量替换在

时间:2019-01-25 09:12:29

标签: docker variables environment-variables

我正在尝试使用变量替换在docker中部署堆栈,但是当我运行docker stack deploy --compose-file email.yaml email时,出现无效的引用格式错误。这是我的email.yaml:

version: '3' 
services:   
  emailservice:
    image: 'email:${VERSION}'
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
      resources:
        limits:
          memory: 300 MB
      update_config:
        delay: 12s
    ports:
     - "8000:80"

我已经尝试过email:${VERSION}"email:${VERSION}",但是它也不起作用。

另一方面,我已经阅读到在docker stack deploy中,我无法使用.env文件传递变量。我应该如何通过它们?

谢谢!

3 个答案:

答案 0 :(得分:1)

为此打开了一个feature request。 我遇到了同样的问题,而我能找到的最佳解决方法来自this comment

建议的解决方法使用docker-compose config生成docker-compose.yml输出(使用变量替换):

docker-compose config | docker stack deploy --compose-file - stack_name

答案 1 :(得分:1)

docker stack deploy 默认不处理 .env 文件。这是一个 docker-compose 功能。您可以在一行中对其进行预处理。

docker stack deploy -c <(docker-compose config) stack-name-here

参考:https://github.com/moby/moby/issues/29133#issuecomment-442912378

答案 2 :(得分:0)

Docker Compose自动加载.env文件,但docker stack deploy不会自动加载(请参阅Compose文件参考的Variable substitution部分中的注释)。

您可以通过在与env VAR=VALUE相同的行中使用docker stack deploy来解决此问题:

$ env VERSION=1.2 docker stack deploy -c email.yaml email

您使用的语法是正确的,但是由于缺少替换导致您看到错误。

或者,您可以强制使用${VERSION:?}语法要求来定义变量,这将停止部署并显示易于与丢失的变量相关的错误:

$ docker stack deploy -c email.yaml email
invalid interpolation format for services.emailservice.image: "required variable VERSION is missing a value: ". You may need to escape any $ with another $.

希望有帮助。