如何删除旧的Docker容器
这个问题与我应该关心多余的,不运行的Docker容器有关吗? 。
我想知道如何删除旧的容器。 docker rm 3e552code34a
让你删除一个,但我已经有很多。 docker rm --help
没有给出select选项(像所有的,或通过图像名称)。
也许有一个目录,这些容器存储在哪里我可以很容易地手动删除它们?
在Docker 1.13.x中有一个名为Docker container prune的新特性: docker docker container prune
这将做你想做的事情,并且应该以相同的方式在所有平台上工作。
还有一个Docker系统修剪 ,它将一个命令清理容器,图像,卷和networking。
原始答案:
有一些关于Docker清理命令的讨论。 你可以find这张票的信息: https : //github.com/dotcloud/docker/issues/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 。
另一种方法,我从纪尧姆·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和提交86de7c0 ,这些命令引入了一些新命令来帮助可视化Docker守护程序数据在磁盘上占用多less空间,并允许轻松清除“不需要的”过量。
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 system prune
或docker container prune
。 请参阅VonC更新的答案: https : //stackoverflow.com/a/39860665/411229
以前的答案在上面编写几个不同的提示,删除所有非运行的容器的最优雅的方式似乎是:
docker rm $(docker ps -q -f status=exited)
-
-q
只打印容器ID(没有列标题) -
-f
允许您过滤打印的容器列表(在这种情况下,我们正在过滤只显示退出的容器)
官方的方式是:
docker rm `docker ps -aq`
Docker维护者已经表示,不会有这样的命令 – 而你编写的命令是这样的:
我们之前已经讨论过这个问题,并且希望用户使用上面的代码,而不必为Docker添加额外的代码。
现在可以使用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
过滤。
随着Docker 1.13(2016年第四季度),你现在有:
docker system prune
将删除所有未使用的数据(即按顺序:容器停止,没有容器的卷和没有容器的图像)。
请参阅PR 26108和提交86de7c0 ,这些命令引入了一些新命令来帮助可视化Docker守护程序数据在磁盘上占用多less空间,并允许轻松清除“不需要的”过量。
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
正如wjv的评论,
还有
docker {container,image,volume,network} prune
,这可以用来删除只有一种types的对象的未使用的实例。
在提交913e5cb中引入 ,仅适用于Docker 1.13+。
docker container prune
2017年 更新 (最新)
docker container prune
这 – 2017 (OLD)的方式
去除所有停止的容器
docker rm $(docker ps -a -q)
要删除所有容器 (已停止和未停止)
docker rm -f $(docker ps -a -q)
删除所有停止的容器:
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 --before <container-ID>
或docker ps --before <container-ID>
select在特定容器之前或之后创build的所有容器。 这个function至less在Docker版本0.6.5中。
比方说,你已经开发了你的系统,现在它正在工作,但有一些容器剩下。 您想删除在该工作版本之前创build的容器。 使用docker ps
确定工作容器的ID。
删除在其他容器之前创build的容器
docker rm $(docker ps --before 9c49c11c8d21 -q)
另一个例子。 您的数据库已经在Docker容器上运行。 你已经开发你的应用程序在其他容器上运行,现在你有一些不需要的容器。
删除在某个容器后创build的容器
docker rm $(docker ps --since a6ca4661ec7f -q)
Docker将容器存储在Ubuntu的/var/lib/docker/containers
中。 我认为额外的容器不会造成其他伤害,但会占用磁盘空间。
更新:从Docker版本1.13(2017年1月发布)开始,您可以发出以下命令清理已停止的容器,未使用的卷,悬挂的图像和未使用的networking:
docker system prune
如果您要确保只删除具有exited
状态的容器,请使用以下命令:
docker ps -aq -f status=exited | xargs docker rm
同样,如果你正在清理docker的东西,你可以通过这种方式去除未标记的,未命名的图像:
docker images -q --no-trunc -f dangling=true | xargs docker rmi
这是我的docker清理脚本,它删除未标记的容器和图像。 请检查来源的任何更新。
#!/bin/sh # Cleanup docker files: untagged containers and images. # # Use `docker-cleanup -n` for a dry run to see what would be deleted. untagged_containers() { # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1. docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}' } untagged_images() { # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3. # NOTE: intermediate images (via -a) seem to only cause # "Error: Conflict, foobarid wasn't deleted" messages. # Might be useful sometimes when Docker messed things up?! # docker images -a | awk '$1 == "<none>" {print $'$1'}' docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}' } # Dry-run. if [ "$1" = "-n" ]; then echo "=== Containers with uncommitted images: ===" untagged_containers 0 echo echo "=== Uncommitted images: ===" untagged_images 0 exit fi # Remove containers with untagged images. echo "Removing containers:" >&2 untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true # Remove untagged images echo "Removing images:" >&2 untagged_images 3 | xargs --no-run-if-empty docker rmi
来源: https : //github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup
首先,在尝试删除容器之前停止运行容器
删除运行的容器
docker rm $(docker stop -t=1 $(docker ps -q))
你可以使用kill
而不是stop
。 在我的情况下,我宁愿stop
因为我倾向于重新运行它们,每次创build一个新的,所以我试图很好地closures它们。
注意:试图阻止一个容器会给你一个错误:
错误:不可能删除正在运行的容器,请先停下来
删除所有容器
docker rm $(docker ps -a -q)
从Windowsshell删除所有容器:
FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
https://github.com/HardySimpson/docker-cleanup
Docker清理
一个小巧的一体式shell,可以去除:
- 一天前运行的容器
- 不属于任何剩余容器的图像
打算作为crontab作业运行
特征
- 它将删除所有的
<none>:<none>
图像 - 如果图像具有多个repo:标签引用,它将除去运行容器除去所有repo:标签。 其实这是“dockerrmi”的性质。
- 很多错误信息会显示在屏幕上,你可以决定
2>/dev/null
或不 - 从docker-gc学习一些东西,并解决它的问题(它不能删除具有多个repo:标签的图像)
使用:
docker rm -f $(docker ps -a -q)
它强制停止并删除当地存在的所有容器。
所以,我个人build议把它作为你的部署脚本的一部分来保存图像和容器,只保留最新的n个容器和图像。 我使用与git tag
相同的版本模式来标记我的docker图像,并始终使用“latest”标记最新的docker图像。 这意味着,如果没有清理任何东西,我的docker图像看起来像:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE some_repo/some_image 0.0.5 8f1a7c7ba93c 23 hours ago 925.4 MB some_repo/some_image latest 8f1a7c7ba93c 23 hours ago 925.4 MB some_repo/some_image 0.0.4 0beabfa514ea 45 hours ago 925.4 MB some_repo/some_image 0.0.3 54302cd10bf2 6 days ago 978.5 MB some_repo/some_image 0.0.2 0078b30f3d9a 7 days ago 978.5 MB some_repo/some_image 0.0.1 sdfgdf0f3d9a 8 days ago 938.5 MB
现在,我当然不想把所有的图像(或容器)都留在我所有的生产箱子上。 我只想要最后3或4回滚,摆脱一切。 Unix的tail
是你最好的朋友。 由于docker images
和docker ps
都是按照datesorting的,我们可以使用tail
来select除了前3以外的所有图像,并将其删除:
docker rmi $(docker images -q | tail -n +4)
通过部署脚本(或本地)运行,始终保持足够的图像,以便在不占用太多空间或与旧图像混淆的情况下轻松回滚。
就我个人而言,我只能随时在我的生产箱上放一个容器,但是如果你想要更多的东西,你可以用容器做同样的事情:
docker rm $(docker ps -aq | tail -n +4)
最后,在我简单的例子中,我们一次只能处理一个回购,但如果你有更多的回购,你可以用同样的想法来更复杂一点。 说我只想保留some_repo / some_image的最后3张图片。 我可以混合使用grep
和awk
然后按照我的方式:
docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)
再一次,同样的想法适用于容器,但你明白这一点,所以我会停止给例子。
删除所有停止的容器。
sudo docker rm $(sudo docker ps -a -q)
这将通过使用docker ps -a -q获取所有容器的列表并将其ID传递给docker rm来移除所有停止的容器。 这不应该删除任何运行的容器,它会告诉你它不能删除正在运行的图像。
删除所有未标记的图像
现在你想清理旧的图像,以节省一些空间。
sudo docker rmi $(sudo docker images -q –filter“dangling = true”)
删除5个最旧的容器:
docker rm `docker ps -aq | tail -n 5`
看看剩下多less个容器:
docker ps -aq | wc -l
新方法: spotify / docker-gc发挥技巧。
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
- 一个多小时前退出的容器被移除。
- 之后不属于任何剩余容器的图像将被删除
它支持环境设置
强制删除具有多个标签的图像
FORCE_IMAGE_REMOVAL=1
强制删除容器
FORCE_CONTAINER_REMOVAL=1
从垃圾收集中排除最近退出的容器和图像
GRACE_PERIOD_SECONDS=86400
此设置还可以防止删除已创build时间less于GRACE_PERIOD_SECONDS秒的图像。
空运
DRY_RUN=1
清理孤立的容器卷 CLEAN_UP_VOLUMES = 1
参考: docker-gc
老办法:
删除旧的,不运行的容器
docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm OR docker rm $(docker ps -a -q)
删除与非运行的docker集装箱相关的所有图像
docker images -q | xargs --no-run-if-empty docker rmi
清理Docker版本1.10.x及更高版本的孤立的docker卷
docker volume ls -qf dangling=true | xargs -r docker volume rm
根据时间段
docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
您可以使用以下命令删除已退出的容器:
docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)
这里是充分的要点也删除docker上的旧图像: 要求删除旧的docker和图像 。
#!/bin/bash # docker-gc --- Remove stopped docker containers RUNNING=$(docker ps -q) ALL=$(docker ps -a -q) for container in $ALL ; do [[ "$RUNNING" =~ "$container" ]] && continue echo Removing container: $(docker rm $container) done
我总是使用docker rmi $(docker ps -a -q)
来删除所有图像。
当docker rmi
失败时,您可以删除目录/var/lib/docker/graph
。
-
删除所有docker进程:
docker rm $(docker ps -a -q)
-
删除特定容器:
$ docker ps -a (lists all old containers) $ docker rm container-Id
您只能删除停止的容器。 一开始就停止所有这些
docker stop $(docker ps -a -q)
然后你可以删除
docker rm $(docker ps -a -q)
不用哭就移除所有容器:
sudo docker ps -a | grep -v CONTAINER | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f
对于任何感兴趣的人,我从qkrijger中拿出了这个例子,并把它变成了一个清晰的全部(停止并全部移除)
docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`
docker rm --force `docker ps -qa`
删除从某个图像创build的所有容器:
docker rm $(docker ps -a | awk '/myimage:mytag/{print $1}')
在Ubuntu 14.04(Trusty Tahr)上:
$ for CON in `docker ps -qa`; do docker rm $CON ; done
这只是一个普通的Bash命令,所以它应该适用于每个Bash兼容的terminal。
如果要自动/定期清理已退出的容器,并删除正在运行的容器未使用的图像和卷,则可以下载此图像融水/docker清理。
我在生产中使用它,因为我们每天在多个服务器上部署数次,我不想去每个服务器清理(这将是一个痛苦)。
赶紧跑:
docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest
它会默认每30分钟运行一次(或者使用DELAY_TIME = 1800选项设置它),并清理退出的容器和图像。
更多细节: https : //github.com/meltwater/docker-cleanup/blob/master/README.md