如何使用docker compose更新现有图像?

如何使用docker compose更新现有图像?,docker,docker-compose,gitlab-ci,Docker,Docker Compose,Gitlab Ci,我有多个微服务,我使用docker compose进行开发部署。当microservices代码库中有一些更改时,我会触发ci作业来重新部署它们。我有下面的脚本来做这件事。但每次我都必须从头开始构建所有图像,然后运行它们。完成所有这些操作后,我得到了匿名图像。所以我使用最后一个脚本来删除它们。你有什么建议使这个过程更实用?是否有任何方法可以更新现有图像而不使用新的更改将其删除 - docker-compose build - docker-compose down - docker-compos

我有多个微服务,我使用docker compose进行开发部署。当microservices代码库中有一些更改时,我会触发ci作业来重新部署它们。我有下面的脚本来做这件事。但每次我都必须从头开始构建所有图像,然后运行它们。完成所有这些操作后,我得到了
匿名
图像。所以我使用最后一个脚本来删除它们。你有什么建议使这个过程更实用?是否有任何方法可以更新现有图像而不使用新的更改将其删除

- docker-compose build
- docker-compose down
- docker-compose up -d --force-recreate
- docker rmi $(docker images -f "dangling=true" -q) -f

其他信息:我使用的是
gitlab ci

Docker容器的设计是短暂的。要更新现有容器,请删除旧容器并启动新容器。 因此,您遵循的过程是正确的

可以将命令简化为以下命令:

docker-compose up --force-recreate --build -d
docker image prune -f

使用docker compose版本3,您可以向图像添加标记,并根据您的逻辑进行清理:

build: ./dir
image: yourapp:tag

它可以帮助您避免匿名图像清理

您可以使用以下方法更新它:

docker-compose pull
现在,您的图像已更新。如果运行的是以前版本的容器,则应重新启动它以使用更新的映像:

docker-compose restart

我倾向于确保在下载新图像之前先下载所有图像,以最小化中间状态的时间,或者在图像下载失败的情况下更糟的是在中间。

1) 我拉最新的图片:

docker-compose pull
2) 然后我重新启动容器:

docker-compose up -d --remove-orphans
3) (可选)删除过时的图像:

docker image prune
然后


您不需要“down”“docker compose up-d”命令,它只会重新创建一个更改的命令

您在docker compose命令中错过了-d标志;这是故意的吗?我认为该标志很重要,因为不添加它将运行前台的所有内容,在会话结束后立即删除所有内容。添加它的人(大多数?)会发现
-d
有用/必要。这似乎缺少
docker compose pull
步骤<代码>--强制重新创建不会提取更新的图像;即使图像没有更改,它也只是重新创建容器。只是为了确保我理解,所以每次更新时我都必须重新生成图像,并一次又一次地等待更新?只是运行此操作并没有为我更新容器。您缺少重新运行它的部分。看,这对我很有效。@pir我添加了澄清。重新启动不起作用,因为它不会从拉动中重新创建容器,您必须再次执行
向下
向上-d
。在我的情况下,它会自动重新创建。我认为@yamenk的注释和此注释的组合是最好的方式,以获得这样的答案,因为它不会强制使用
-f
-force recreate
,这可能会产生破坏性的副作用。简单明了如果你没有任何卷,它很好,但如果你这样做,它会删除它们。所以实际上这不是一个更新。
docker-compose pull
docker-compose up -d