9

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

但是,当我尝试将我的服务部署stack到 时swarm,docker 引擎抱怨我的图像不是正确的存储库/标签,并带有以下确切消息:

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

为了解决这个问题,我可以直接在docker-compose.yml文件中修复图像版本。这里有什么逻辑或者它是一个错误吗?但这混合修复了 docker-compose 和变量的一部分。

干杯,奥利维尔

4

5 回答 5

22

in 中的 yaml 解析器docker stack deploy不具有 in 中的所有相同功能docker-compose。但是,您可以docker-compose config在完成所有变量替换、扩展其他文件以及将多个文件合并在一起后输出一个 yaml 文件。这实际上变成docker-compose了一个预处理器。

于 2017-06-22T10:04:52.023 回答
8

答案很简单:它不是错误,也不是功能。.env目前不支持docker stack. .env您必须在运行export $(cat .env)之前手动获取运行源docker stack ...

在 Docker Github 中有一个问题在讨论这个需求。 https://github.com/docker/docker.github.io/issues/3654 另一个讨论问题和解决方案:https ://github.com/moby/moby/issues/29133#issuecomment-285980447

于 2017-06-22T08:52:32.283 回答
4

如前所述,.env当前不支持docker stack. 所以另一种方法是使用 by 明确指定环境文件env_file,例如:

version: '3.3'
services:
  foo-service:
    image: foo-image
    env_file:
      - .env
    environment:
      - SOME_ENV=qwerty
于 2019-02-11T20:50:40.273 回答
3

你可以创建一个deploy.sh

export $(cat .env) > /dev/null 2>&1; docker stack deploy ${1:-STACK_NAME}
  • .env没有正则表达式或不稳定技巧的解析。
  • 内部stderr产生的错误将被重定向到(2>&1)#comments.envstdin
  • export不想要的所有和error现在的打印都stdin被重定向到/dev/null. 这可以防止控制台泛滥。
  • 这些错误不会阻止.env正确解析。

我们可以STACK_NAME在我们的定义,.env但我们也可以通过我们定制的stack_name

. deploy.sh <stack_name> (stack_name opcional)

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

于 2021-01-02T03:21:51.403 回答
0

我遇到了同样的问题,我的问题是由在不同的 python 虚拟环境中运行 docker-compose 引起的。

我希望这会有所帮助。

似乎通过在不同的 python 虚拟环境上运行,我破坏了 docker-compose 依赖 pythondotenv

于 2020-10-11T00:58:50.287 回答