Docker Swarm将图像版本外部化为.env文件
我曾经将我的图像版本外部化到我的.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
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_文件(传递到容器中)