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

Docker Swarm with image versions externalized to .env file

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

但是当我尝试使用 stack 将我的服务部署到 swarm 时,docker 引擎抱怨我的图像不正确 reposity/tag以下消息:

Error response from daemon: rpc error: code = 3 desc = ContainerSpec: "GROUP/IMAGE:" is not a valid repository/tag

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

干杯, 奥利维尔

答案很简单:这不是错误,也不是功能。 .env 当前不受 docker stack 支持。 您必须在 运行 docker stack ...

之前手动获取 .env 运行 export $(cat .env)

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

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

如前所述,docker stack 当前不支持 .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 stack deploy ${1:-STACK_NAME}
  • .env 解析没有正则表达式或不稳定的技巧。
  • #comments.env 中产生的 stderr 上的错误将被重定向到 stdin (2>&1)
  • 现在 stdin 上所有 exporterror 的不需要的照片也被重定向到 /dev/null。这可以防止控制台泛滥。
  • 这些错误不会阻止 .env 被正确解析。

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

. deploy.sh <stack_name> (stack_name opcional)

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