Docker Swarm将图像版本外部化为.env文件

Docker Swarm将图像版本外部化为.env文件,docker,docker-swarm-mode,docker-stack,Docker,Docker Swarm Mode,Docker Stack,我曾经将我的图像版本外部化到我的.env文件中。这使它易于维护,而且我不会仅仅为了升级版本而修改我的docker compose.yml文件,所以我确信我不会错误地删除一行 但是,当我尝试将带有堆栈的服务部署到swarm时,docker engine会抱怨我的映像不是正确的reposity/tag,并显示以下消息: 来自守护程序的错误响应:rpc Error:code=3 desc=ContainerSpec:“GROUP/IMAGE:”不是有效的存储库/标记 要解决这个问题,我可以直接在doc

我曾经将我的图像版本外部化到我的.env文件中。这使它易于维护,而且我不会仅仅为了升级版本而修改我的
docker compose.yml
文件,所以我确信我不会错误地删除一行

但是,当我尝试将带有
堆栈的服务部署到
swarm
时,docker engine会抱怨我的映像不是正确的reposity/tag,并显示以下消息:

来自守护程序的错误响应:rpc Error:code=3 desc=ContainerSpec:“GROUP/IMAGE:”不是有效的存储库/标记

要解决这个问题,我可以直接在
docker compose.yml
文件中修复图像版本。这里有什么逻辑吗?还是说这是一个bug?但这混合了docker组件的固定部分和可变部分

干杯,
Olivier

答案很简单:它既不是bug,也不是功能
.env
当前不受
docker stack
支持。 在运行
docker堆栈之前,必须手动获取
.env
运行
导出$(cat.env)

Docker Github中讨论了这一需求的一个问题。
另一个讨论问题和解决方案:

docker stack deploy
中的yaml解析器与
docker compose
中的yaml解析器不具备所有相同的功能。但是,在完成所有变量替换、扩展其他文件以及将多个文件合并到一起后,可以使用
docker compose config
输出yaml文件。这有效地将
docker compose
转换为预处理器。

如前所述,
docker堆栈当前不支持
.env
。 因此,另一种方法是使用
env_file
明确指定环境文件,例如:

version: '3.3'
services:
  foo-service:
    image: foo-image
    env_file:
      - .env
    environment:
      - SOME_ENV=qwerty

我也遇到过同样的问题,, 我的问题是在不同的python虚拟环境中运行docker compose造成的

我希望这能有所帮助


通过在不同的python虚拟环境上运行,我似乎破坏了docker compose依赖项pythondotenv,您可以创建一个
deploy.sh

export$(cat.env)>/dev/null 2>&1;docker堆栈部署${1:-堆栈名称}
  • .env
    解析时不使用正则表达式或不稳定的技巧
  • .env
    中的
    #comments
    产生的
    stderr
    上的错误将重定向到
    stdin
    (2>&1)
  • 所有
    导出
    错误
    现在也在
    stdin上
    的不需要的打印也被重定向到
    /dev/null
    。这可以防止控制台溢出
  • 这些错误不会阻止正确解析
    .env
我们可以在
.env
中定义
STACK\u NAME
,但我们也可以传递自定义的
STACK\u NAME

。deploy.sh(堆栈名称选项)

这个解决方法让我头痛了3个晚上

Hi@bmitch。我知道
docker-stack-deploy
并没有
docker-compose
拥有的所有功能。这就是我在下面自己的答案中写的,并在GitHub中链接到相关问题。顺便说一下,我不知道我们可以使用
docker compose
作为预处理器。谢谢你的提示,谢谢!我使用了一个脚本deploy.sh,它很简单,而且可以正常工作:
#/usr/bin/env bash docker compose config>docker-compose-parsed.yaml docker stack deploy-c./docker-compose-parsed.yaml MY_SERVICE
这应该是公认的答案——与从stdin读取的
docker stack deploy-c-
结合使用,那么您有了
docker compose config | docker stack deploy-c-
它是否支持
.env
文件中的变量替换,例如
PGDATABASE=${DATABASE_HOST}
当这样使用时?我只是用一个小示例进行了尝试,答案是否定的:(@RogerCollins,你有什么docker版本?docker compose文件的版本是什么?你的.env文件看起来怎么样?请提供更多信息details@xxxceptiondocker versions>18.09-
docker stack
不支持env_文件。请参阅问题:您混淆了.env(用于docker compose模板本身)和env_文件(传递到容器中)