如何停止所有基于给定镜像的Docker容器

95次阅读
没有评论

问题描述

想要知道如何停止所有基于特定镜像的Docker容器。以 mariadb 镜像为例,用户希望停止所有直接基于这个镜像的容器(包括版本为 10.4 和 10.3 的容器)。

解决方案

以下操作可能会受版本差异影响,请谨慎操作,并确保备份数据。

方案1:使用docker kill命令和docker ps命令的过滤器

用户之前尝试过使用以下命令,但这会停止所有基于 mariadb:10.3 镜像的容器,而不仅仅是直接基于该镜像的容器:

sudo docker kill $(sudo docker ps --filter ancestor=mariadb:10.3)

方案2:使用docker ps输出进行过滤

以下解决方案将实现用户的要求:仅停止直接基于 mariadb 镜像的容器,而不考虑其标签。这个方案使用了 awk 命令来处理 docker ps 的输出。

sudo docker kill $(sudo docker ps --format '{{.ID}} {{.Image}}' | awk '$2 ~ /^mariadb:/ { print $1}')

这个命令的步骤如下:
1. 使用 docker ps 命令获取所有容器的列表。
2. 使用 --format 参数指定输出格式,以便我们能够获取容器的ID和镜像信息。
3. 使用 awk 命令来筛选出直接基于 mariadb 镜像的容器的ID。
4. 最后,将这些容器的ID传递给 docker kill 命令,以停止这些容器。

这个方案的优点在于,它只会停止直接基于指定镜像的容器,而不会影响其他不相关的容器。

请注意,方案2中使用的--format参数可以确保即使docker ps的输出格式发生变化,也能正确获取所需的信息。此外,这个方案还考虑了docker ps输出格式的可配置性,因此更具有通用性。

方案3:使用脚本管理容器启动顺序

如果需要更高度的控制,还可以编写脚本来管理容器的启动和停止顺序。这可以确保容器按照特定的顺序启动和停止,以满足复杂的依赖关系。

请注意,无论选择哪个方案,都应该谨慎操作,确保备份重要数据,并根据具体情况进行调整。

总结

通过使用合适的命令和方法,你可以轻松地停止所有基于特定镜像的Docker容器。在选择适合你情况的方案时,务必考虑到版本差异以及容器之间的依赖关系。

正文完