我想知道如何删除旧的容器。使用
docker rm 3e552code34a
可以删除一个容器,但是我已经有很多了。docker rm --help
没有提供选择选项(例如全部或按镜像名称)。也许有一个目录存储这些容器,我可以手动轻松删除它们吗?
docker rm 3e552code34a
可以删除一个容器,但是我已经有很多了。docker rm --help
没有提供选择选项(例如全部或按镜像名称)。自从Docker 1.13.x版本起,您可以使用Docker container prune来清理 Docker 容器:
docker container prune
这将删除所有已停止的容器,并且在所有平台上的效果相同。
还有一个Docker system prune命令:
docker system prune
该命令将清理所有未使用的容器、网络、镜像(包括悬空和未引用的),并可选择清理卷。
对于旧版本的Docker,可以将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。
docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
(翻译说明:该命令用于Docker容器中删除所有未被打上标签的镜像。) - Mohan Raj-rm
选项,在构建成功后删除中间容器。 - Freek Kalterdocker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
。请注意,此命令是用于 Docker 环境的。 - omnidocker rmi $(docker images -q -f dangling=true)
。 - Ghjnut另一种方法,我从Guillaume J. Charmes那里得到的(功劳归于他):
docker rm `docker ps --no-trunc -aq`
将以优雅的方式删除所有容器。
而Bartosz Bilicki为Windows编写:
FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
对于PowerShell:
docker rm @(docker ps -aq)
在 Docker 1.13(2016年第四季度)中进行了更新,感谢VonC(本帖的后续回答):
docker system prune
将删除所有未使用的数据(即:已停止的容器、没有容器的卷以及没有容器的映像)。
请参见 PR 26108 和 commit 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
docker ps -a -q | xargs docker rm
有效(可能需要sudo)。 - FUDdocker rm $(docker ps -a -q)
的意思是什么? - qkrijger--no-trunc
没有任何意义,因为无论如何 docker rm
都不需要完整的容器 ID。 - Pithikos更新的答案
现在使用docker system prune
或docker container prune
。请参见VonC更新后的答案。
旧答案 综合上面的几个提示,最优雅的删除所有非运行容器的方法似乎是:
docker rm $(docker ps -q -f status=exited)
-q
仅打印容器ID(不包括列标题)-f
允许您过滤打印的容器列表(在这种情况下,我们正在过滤仅显示已退出的容器)-v
以避免悬挂卷:docker rm -v $(docker ps -q -f status=exited)
。有关悬挂卷的详细信息,请参见https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container。 - rlubaalias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
- Frank Neblung官方的方法是:链接
docker rm `docker ps -aq`
Docker维护人员已经表示不会为此提供命令 - 而是像这样组合命令:
我们之前已经讨论过并且更喜欢用户使用上面的命令行,而不必向Docker添加额外的代码。
docker volume
子命令和命名卷。 - L0j1kdocker system prune -a
将删除所有未使用的数据(即:停止的容器、没有容器的卷和没有容器的镜像)。
docker system prune
不带-a参数只会删除(对于镜像)悬空的镜像,或者没有标签的镜像,如commented所述,由smilebomb提供。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
docker {container,image,volume,network} prune
,可以用来删除仅仅一种类型的未使用实例。docker container prune
对于现代版本的Docker来说,正确的答案是:"清理未使用的Docker对象"
docker system prune -a
的,它可以删除未使用的镜像。而 docker system prune
只会删除 悬空 镜像,即没有标签的镜像。 - smilebomb更新 2021年(最新)
docker container prune
这是 - 2017 (旧的) 方法
用于删除所有已停止的容器
docker rm $(docker ps -a -q)
删除 所有容器 (停止和非停止)
docker rm -f $(docker ps -a -q)
docker volume/container/image prune
,请参见https://dev59.com/DGQm5IYBdhLWcg3w6ShR#39860665。 - Eugen Mayer- Aniket J kambledocker container prune --filter "until=24h"
现在可以使用筛选功能来对 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
过滤器。
storage
容器。 - Sobriquestatus=created
来获取那些未运行过且从未运行过的任务。 - enderland删除所有已停止的容器:
docker rm $(docker ps -a | grep Exited | awk '{print $1}')
根据 pauk960 的评论:
从版本1.3.0开始,您可以在
docker ps
中使用过滤器,而不是使用grep Exited
,请使用docker ps -a -f status=exited
。如果您与其一起使用-q
,则只能获取容器ID,而无需使用awk获取完整输出。
如果您不想删除所有容器,您可以使用 docker ps -f before=<container-ID>
或 docker ps -f since=<container-ID>
选择在特定容器之前或之后创建的所有容器。
假设您已经开发出系统并让它运行起来,但是还剩下一些容器。您希望删除在该工作版本之前创建的容器。使用 docker ps
确定正在运行的容器的ID。
删除在另一个容器之前创建的容器
docker rm $(docker ps -f before=9c49c11c8d21 -q)
另一个例子。您的数据库已在Docker容器上运行。您已经开发好了在另一个容器上运行的应用程序,现在您有许多不需要的容器。
删除在某个容器之后创建的容器
docker rm $(docker ps -f since=a6ca4661ec7f -q)
Docker在Ubuntu中将容器存储在/var/lib/docker/containers
中。我认为多余的容器不会造成其他影响,但会占据磁盘空间。
更新:从 Docker 1.13 版本起(发布于2017年1月),您可以执行以下命令清理已停止的容器、未使用的卷、悬空镜像和未使用的网络:
docker system prune
如果你想确保只删除那些具有 "已停止" 状态的容器,可以使用以下命令: docker rm $(docker ps -a -f status=exited -q)
docker ps -aq -f status=exited | xargs docker rm
同样,如果你正在清理Docker相关内容,你可以通过以下方式摆脱未打标签、无名称的镜像:
docker images -q --no-trunc -f dangling=true | xargs docker rmi
docker system prune
命令。请参见我的下面的回答。 - VonCDocker version 1.12.3, build 6b644ec
上没有用 :) - ReynierPMPortainer
我们可以使用这个工具来管理所有旧的容器、未使用的卷和镜像它是一个简单的Docker管理UI请参考下面我的更新,了解如何部署应用程序 - Anish Varghese