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

时间:2017-06-22 08:52:32

标签: docker docker-swarm-mode docker-stack

我曾经将我的图片版本外化到我的.env文件中。这样可以轻松维护,我不会修改我的docker-compose.yml文件只是为了升级版本,所以我确定我不会错误删除某行或其他任何内容。

但是,当我尝试使用stack将我的服务部署到swarm时,docker引擎会抱怨我的图片不是正确的重新定位/标记,并提供以下消息:

  

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

要解决此问题,我可以直接在docker-compose.yml文件中修复图片版本。这里有任何逻辑还是错误?但是这个混合修复了docker-compose和variable的部分内容。

干杯, 奥利弗

5 个答案:

答案 0 :(得分:3)

答案很简单:它不是错误,也不是功能。 .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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

您可以创建一个 deploy.sh

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

我们可以在 STACK_NAME 中定义 .env 但我们也可以传递我们自定义的 stack_name

. deploy.sh <stack_name> (stack_name opcional)

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

答案 4 :(得分:0)

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

我希望这会有所帮助。

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