题 如何删除旧的Docker容器


这个问题与此有关 我应该关注多余的,非运行的Docker容器吗?

我想知道如何删除旧容器。该 docker rm 3e552code34a 让你删除一个,但我已经很多了。 docker rm --help 不提供选择选项(如全部或图像名称)。

也许有一个存储这些容器的目录,我可以手动轻松删除它们?


987
2018-06-21 13:41


起源


您还应该考虑清理孤立的码头工作量。 我经常发现它们比旧容器和旧图像消耗更多空间。可以在以下位置找到用于删除孤立码头卷的好脚本: github.com/chadoe/docker-cleanup-volumes。 - Nemanja Trifunovic
也许 github.com/chadoe/docker-cleanup-volumes 可以帮你。 - user1929959
你也可以使用 docker run随着 --rm 标志会使容器短暂,在运行后删除所有容器文件。 - Gordon
我同意@NemanjaTrifunovic。请注意。将它保存在你的工具栏中:docker volume ls -f dangling = true - bitfox
使用docker 1.13(2016年第4季度),您还可以考虑新的 docker system prune 命令。看到 我的答案如下。 - VonC


答案:


有一个新功能 Docker 1.13.x 叫 Docker容器修剪docker container prune

这将做你想要的,并且应该以相同的方式在所有平台上工作。

还有一个 Docker系统修剪docker system prune,它将在一个命令中清理容器,图像,卷和网络。

原答案:

有一些关于Docker清理命令的讨论。您可以在此机票上找到相关信息: 实现'干净'命令 (#928)

在该命令可用之前,您可以将Docker命令与其他Unix命令组合在一起以获得所需的信息。这是一个关于如何清理几周旧容器的示例:

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

为了给予信任,它应该到期,这个例子来自 https://twitter.com/jpetazzo/status/347431091415703552


1103
2018-06-21 14:25



用于删除所有未标记图像的类似命令: docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi - Mohan Raj
@MichelMüller从dockerfile构建图像时可以指定 -rm 成功构建后删除中间容器的选项。 - Freek Kalter
@MichelMüller图像是用于缓存的图像,因此删除容器不会影响它。 - Ken Cochrane
如果你想使用awk这个,请考虑这个命令,如果你想做rm所有停止的容器(因为第一行没有错误): docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm - masi
如果您获得权限被拒绝错误,请添加 sudo 在最后一个命令的docker之前: $ sudo docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f - Luciano Bargmann


另一种方法,我从Guillaume J. Charmes获得(信用到期):

docker rm `docker ps --no-trunc -aq`

将以优雅的方式移除所有容器。

对于Windows,由Bartosz Bilicki撰写:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

对于PowerShell:

docker rm @(docker ps -aq)

使用Docker 1.13(2016年第4季度)的更新,归功于 VonC (后来在这个帖子里):

docker system prune 将删除所有未使用的数据(即按顺序:容器停止,没有容器的卷和没有容器的图像)。

看到 PR 26108 和 提交86de7c0,它引入了一些新命令,以帮助显示Docker守护程序数据在磁盘上占用多少空间,并允许轻松清理“不需要的”多余部分。

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

581
2017-08-09 06:41



这在某种程度上对我不起作用,但是 docker ps -a -q | xargs docker rm 工作,(可能需要sudo) - FUD
关于什么 docker rm $(docker ps -a -q) ? - qkrijger
@qkrijger,除了添加bashism之外,这不会改变你原来的答案。问题在于命令行溢出。 xargs variant以一种很好的方式处理它。我还要添加--no-trunk到docker ps以避免(不太可能)id冲突。 - Ihor Kaharlichenko
请注意,如果您使用仅数据容器,它也会删除它们 - nXqd
我没有看到这一点 --no-trunc 以来 docker rm 无论如何都不需要完整的ID。 - Pithikos


更新的答案 使用 docker system prune 要么 docker container prune 现在。看到 VonC的更新答案

上一个答案 根据上面的几个不同提示,删除所有非运行容器的最优雅方法似乎是:

docker rm $(docker ps -q -f status=exited)

  • -q 只打印容器ID(没有列标题)
  • -f 允许您过滤打印容器列表(在这种情况下,我们过滤只显示已退出的容器)

387
2018-04-06 15:34



这应该是正确的答案,因为它依赖于docker告诉您哪些容器不再使用,而不是假设$(docker images)的文本输出格式不会改变。仅产生一个额外过程而不是两个过程的奖励积分。 - eurythmia
您可能想要添加 -v 避免悬空量: docker rm -v $(docker ps -q -f status=exited)。看到 docs.docker.com/userguide/dockervolumes/... 有关悬空卷的详细信息。 - rluba
@rluba显然在Docker 1.9中会有一个单独的卷api来处理这个问题。 github.com/docker/docker/pull/14242 - Ryan Walls
别名可能很方便: alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)" - Frank Neblung
这也适用于Windows下的PowerShell。 - Tobias


官方的方式 是:

docker rm `docker ps -aq`

Docker维护者已经表示不会有这样的命令 - 你可以编写这样的命令:

我们之前已经讨论过这个问题,并且希望用户使用上面的代码而无需向Docker添加其他代码。


242
2018-06-18 04:23



这是一个糟糕的解决方案,因为它还会删除存储容器。 - Sobrique
你是什​​么意思“存储容器”?如果您指的是曾经一度使用数据的容器来保留对数据卷的引用,那么由于可用性不再需要 docker volume 子命令和命名卷。 - L0j1k
请注意,这在Windows Powershell中不起作用。为此,这是一个更好的解决方案: stackoverflow.com/a/23674294/1150683 - Bram Vanroy
@Sobrique如果你没有反应,至少你应该删除你的评论,这几乎是完整和有害的废话。 - peterh


使用Docker 1.13(2016年第4季度),您现在拥有:

docker system prune -a 将删除所有未使用的数据(即按顺序:容器停止,没有容器的卷和没有容器的图像)。

docker system prune 没有-a将删除(对于图像)仅悬空图像,或没有标签的图像,如 评论 通过 smilebomb

看到 PR 26108 和 提交86de7c0,它引入了一些新命令,以帮助显示Docker守护程序数据在磁盘上占用多少空间,并允许轻松清理“不需要的”多余部分。

docker system prune -a

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

wjv 注释,

还有 docker {container,image,volume,network} prune,可用于删除just的未使用实例  对象的类型。

介绍 提交913e5cb,仅适用于Docker 1.13+。

docker container prune

106
2017-10-04 19:51



感谢分享 - 为了让这一点变得可见,我引用了你在线程中的答案 - qkrijger
我已经赞成你了:) - qkrijger
像往常一样,添加 -f 标志强制清理没有问题。 - Dirk
应该被标记为现在正确的答案,上面的大部分时间都是正确的,但是现在过于复杂 - Eugen Mayer
同意,最近这么容易,你走了! - Maxim Geerinck


现在可以使用了 滤波 同 docker ps

docker rm $(docker ps -q -f status=exited)

并为 图片

docker rmi $(docker images -q -f "dangling=true")

但是,任何这些都会导致 docker rm 要么 docker rmi 在没有匹配的容器时抛出错误。年纪越大 docker rm $(docker ps -aq) 伎俩甚至更糟,因为它试图移除任何正在运行的容器,每个容器都失败了。

这是一个更清晰的脚本,可以添加到您的 ~/.bashrc 要么 ~/.profile :

# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

编辑:如下所述,原始答案是删除图像,而不是容器。更新以回答这两个问题,包括文档的新链接。感谢Adrian(和Ryan的回答)提到新的 ps 过滤。


100
2018-06-23 02:07



注意这个的真正优势 - 你不会意外杀死 storage conatiners。 - Sobrique
你也可以使用 status=created 获得那些没有运行但从未运行的。 - Elysian Fields


更新  2017年 (最新)

docker container prune

这个 - 2017年 (OLD)方式

去除 所有停止的容器 

docker rm $(docker ps -a -q)

去除 所有容器  (已停止且未停止)

docker rm  -f $(docker ps -a -q)

87
2017-08-08 20:37



在OS X上为我工作 - cljk
downvoted,因为这是肯定的 不 你在2017年的表现方式 - 肯定会 docker volume/container/image prune,见 stackoverflow.com/a/39860665/3625317 - Eugen Mayer
因为a)这个答案来自2016年,并且b)很多人没有跑出边缘,所以投票反击了downvote。 - keen