删除除一个以外的所有Docker容器

nic*_*bpe 20 docker

我有脚本停止容器,然后删除它们

docker stop $(docker ps -q)
docker rm $(docker ps -a -q)
Run Code Online (Sandbox Code Playgroud)

但我不想删除名为"my_docker"的docker容器.

如何删除除此之外的所有容器?

nwi*_*ler 29

你可以试试这个

  • 过滤掉不需要的项目(grep -v),然后
  • 返回第一列,其中包含容器ID

运行此命令:

docker rm $(docker ps -a | grep -v "my_docker" | awk 'NR>1 {print $1}')
Run Code Online (Sandbox Code Playgroud)

要使用cut而不是awk,请尝试以下方法:

docker rm $(docker ps -a | grep -v "my_docker" | cut -d ' ' -f1)
Run Code Online (Sandbox Code Playgroud)

awk/ cutusage的示例:bash:获取第n列输出的最短路径

  • 这还将返回列标题名称(至少在Windows上如此),因此它将尝试删除容器ID“ CONTAINER”并显示错误。没有任何后果,但是对于像我这样的纯粹主义者,只需使用docker rm $(docker ps -a | grep -v“ my_docker” | awk'NR> 1 {print $ 1}')`删除第一行:) (2认同)

Cyb*_*tic 13

问题的标题要求图像,而不是容器.对于那些想要删除除了一个以外的所有图像的问题的绊脚石,您可以使用docker prune和过滤器标记:

docker image prune -a --force --filter "label!=image_name"
Run Code Online (Sandbox Code Playgroud)

将image_name替换为图像名称.

您还可以使用"until ="标志按日期修剪图像.

  • 如果有人想知道如何在修剪之前测试过滤器,请使用“docker ls”,如“docker image ls -a --filter "label!=image_name"”。不过,正如 @djuarez 所指出的,否定过滤器不起作用,它会抛出“来自守护程序的错误响应:无效的过滤器‘标签!’” (6认同)
  • Docker 每 3.2 秒更改一次文档,因此如果它现在被弃用,也不会感到惊讶。肯定是用来工作的。 (3认同)
  • 您确定对过滤器求反确实有效吗?这似乎不起作用。 (2认同)
  • 现在这将删除所有图像。 (2认同)
  • 然而,至少文档似乎仍然支持这个答案,无论它是否真正有效。 (2认同)

so-*_*ude 7

这是实际发生的情况docker rm $(List of container Ids)。因此,这只是如何过滤容器ID列表的问题。

例如:如果您要删除除具有特定容器ID的所有容器之外的所有容器,则docker rm $(docker ps -a -q | grep -v "my_container_id")可以完成此操作。