在询问之前,我已经进行了研究,但所有答案都使我得出相同的结论:
docker stack deploy --compose-file docker-compose.yml stackdemo
没有直接的方法可以使以下(我认为是常识)场景无缝地工作吗?
docker-compose up
拉动项目并“本地”构建项目docker stack deploy
将堆栈推入群集,将图像传播到所有工作节点。维护注册表(或为云平台付费)似乎是在Swarm模式下使用Docker的巨大缺点。
旁注:我已经尝试了deploying a registry as a service within the stack的方法,并标记+将图像推入127.0.0.1/myimage
,但这导致了一系列自身的问题-例如没有运行“注册表”容器实例的工作程序节点无权提取映像(需要将注册表复制到所有节点)。
答案 0 :(得分:1)
答案 1 :(得分:0)
Docker swarm 是编排的,用于或旨在管理 Docker 节点集群。当部署任何服务时,docker 引擎可以在集群中的任何节点(如果提供满足放置约束的节点)上启动它。现在,如果没有注册表,并且本地节点上有可用的图像,docker 无法验证是否所有节点都将指向同一版本的图像。因此,swarm 从注册中心拉取镜像,然后将其部署到节点。
即使在一个或所有 docker 节点上修剪图像,拥有注册表也有助于保留图像的副本,并且注册表会保留所有版本。可以启用注册表备份,因此不会丢失任何构建并推送到注册表的映像。
启动注册表(至少在本地主机上)非常容易 - 但这不是您的问题。
谈到您的问题,您可以将撰写堆栈文件保存在您拥有 Dockerfile 的同一目录中,然后在堆栈撰写文件中您可以编写将在部署堆栈时构建的服务:
version: "3.9"
services:
web:
image: 127.0.0.1:5000/stackdemo
build: .
ports:
- "8000:8000"
这里,
build: .
此行将带有给定名称标记的映像构建到本地主机上的注册表 - 但不会推送,这需要手动完成。 因此,在 Dockerfile 中,您可以编写 git pull 或 git clone 然后运行命令来构建您的代码等。
这是一个链接,它提供了在部署堆栈时动态启动注册表和构建映像的简单步骤: https://docs.docker.com/engine/swarm/stack-deploy/
此外,swarm 在没有注册表的情况下无法工作,因此不可能只保存和加载图像并与 swarm 编排一起使用。