【发布时间】:2018-03-19 05:03:23
【问题描述】:
我正在尝试在本地计算机上以集群的形式部署一组服务以进行测试,并且我想在每次从管理器节点运行或部署堆栈时构建 docker 映像。
这可能是我想要实现的目标吗..
【问题讨论】:
标签: docker docker-compose dockerfile docker-swarm
我正在尝试在本地计算机上以集群的形式部署一组服务以进行测试,并且我想在每次从管理器节点运行或部署堆栈时构建 docker 映像。
这可能是我想要实现的目标吗..
【问题讨论】:
标签: docker docker-compose dockerfile docker-swarm
在 Docker Swarm 上,您无法构建在 Docker Compose 文件中指定的映像:
注意:在使用(版本 3)Compose 文件以 swarm 模式部署堆栈时会忽略此选项。
docker stack命令只接受预构建的图像。 - from docker docs
你需要用docker build创建镜像(在Dockerfile所在的文件夹上):
docker build -t imagename --no-cache .
执行此命令后,图像(名为 imagename)现在可以在本地注册表中使用。
您可以在 Docker Compose 文件中使用此映像,如下所示:
version: '3'
services:
example-service:
image: imagename:latest
【讨论】:
您需要使用 docker build 来构建镜像。 Docker swarm 不能使用标签来识别图像。相反,它会在执行堆栈部署时记住图像的图像 ID(哈希),因为标签可能会在以后更改,但哈希永远不会改变。
因此,您应该引用 docker image ls 所示的镜像哈希值,这样 docker swarm 就不会尝试在某个注册表中找到您的镜像。
version: '3'
services:
example-service:
image: imagename:97bfeeb4b649
【讨论】:
更新本地图像时,您将收到如下错误
image IMAGENAME:latest could not be accessed on a registry to record
its digest. Each node will access IMAGENAME:latest independently,
possibly leading to different nodes running different
versions of the image.
为了克服这个问题,如下强制启动服务
docker service update --image IMAGENAME:latest --force Service Name
在上面的例子中它是
docker service update --image imagename:97bfeeb4b649 --force 服务名称
【讨论】: