镜像版本已外部化至.env文件的Docker Swarm

Oli*_*ier 4 docker docker-swarm-mode docker-stack

我曾经将映像版本外部化为.env文件。这使维护变得容易,而且我docker-compose.yml不仅仅为了升级版本就修改文件,所以我确定我不会误删一行。

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

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

要解决此问题,我可以直接在docker-compose.yml文件中修复映像版本。这里有逻辑还是一个错误?但这混合了docker-compose和变量部分的修复部分。

干杯,奥利维尔

BMi*_*tch 7

中的yaml解析器docker stack deploy不具有中的所有相同功能docker-compose。但是,docker-compose config在完成所有变量替换,扩展其他文件以及将多个文件合并在一起之后,您可以用来输出yaml文件。这实际上变成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` (2认同)
  • 这应该是公认的答案——将它与从标准输入读取的 `docker stack deploy -c -` 结合使用,这样你就有了 `docker-compose config | docker stack deploy -c -` (2认同)

小智 7

你可以创建一个deploy.sh

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

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

. deploy.sh <stack_name> (stack_name opcional)
Run Code Online (Sandbox Code Playgroud)

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


Oli*_*ier 5

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


小智 4

正如已经提到的,.env当前不支持docker stack. 因此,另一种方法是使用 by 明确指定环境文件env_file,例如:

version: '3.3'
services:
  foo-service:
    image: foo-image
    env_file:
      - .env
    environment:
      - SOME_ENV=qwerty
Run Code Online (Sandbox Code Playgroud)

  • 我只是用一个小例子尝试了一下,答案是否定的:( (4认同)