这个问题与我是否应该关注过量的、未运行的Docker容器有关。
我想知道如何移除旧容器。docker rm 3e552code34a允许你删除一个,但我已经有很多了。Docker rm——help没有提供选择选项(像all一样,或者通过映像名称)。
也许有一个存放这些容器的目录,我可以很容易地手动删除它们?
这个问题与我是否应该关注过量的、未运行的Docker容器有关。
我想知道如何移除旧容器。docker rm 3e552code34a允许你删除一个,但我已经有很多了。Docker rm——help没有提供选择选项(像all一样,或者通过映像名称)。
也许有一个存放这些容器的目录,我可以很容易地手动删除它们?
当前回答
您可以使用多种方式删除容器,我将在后面的回答中解释它们。
码头集装箱修剪。该命令删除所有现在不工作的容器。您可以通过比较docker ps和docker ps -a的输出来找出哪些容器没有工作。docker ps -a中列出的但docker ps中不存在的容器现在没有工作,但它们的容器没有被删除。 Docker kill $(Docker ps -aq)。这个命令的作用是,通过执行$(docker ps -aq),它返回所有容器的id列表并杀死它们。有时此命令不起作用,因为正在运行的容器正在使用它。要做到这一点,你可以使用——force选项。 Docker rm $(Docker ps -aq)。它与第二个命令的定义相同。它们之间唯一的区别是它会删除容器(和docker prune一样),而docker kill不会。 有时需要删除映像,因为您更改了Dockerfile的配置,需要删除它来重新构建。为此,你可以通过运行docker images来查看所有的图像,然后复制你想要删除的图像的ID。只需执行docker image rm <image-id>即可删除。
PS:你可以用docker PS -a -q代替docker PS -aq,两者没有区别。因为在基于unix的操作系统中,您可以像上面的例子一样加入选项。
其他回答
更新后的答案 现在使用docker系统修剪或docker容器修剪。请看VonC的最新答案。
以前的回答 综合上面几个不同的提示,删除所有非运行容器的最优雅的方法似乎是:
Docker rm $(Docker ps -q -f status=exit)
-q只打印容器id(没有列标题) -f允许你过滤打印的容器列表(在这种情况下,我们过滤只显示退出的容器)
只能删除停止的容器。一开始就阻止他们
Docker stop $(Docker ps -a -q)
然后你就可以移除
Docker rm $(Docker ps -a -q)
我总是使用docker rmi $(docker ps -a -q)删除所有图像。
当docker rmi失败时,可以删除/var/lib/docker/graph目录。
因此,我个人建议将此作为映像和容器的部署脚本的一部分,只保留最近的n个容器和映像。我用与git标签相同的版本控制模式标记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个回滚来去掉其他的东西。尤尼克斯的尾巴是你最好的朋友。由于docker images和docker ps都是按日期排序的,我们可以使用tail选择除前三个之外的所有图像并删除它们:
docker rmi $(docker images -q | tail -n +4)
将其与部署脚本一起运行(或在本地运行),以始终保留足够的映像,以便能够轻松地回滚,而不会占用太多空间或将旧映像弄得乱七八糟。
就我个人而言,我只在我的生产盒上保留一个容器,但如果你想要更多的容器,你可以对容器做同样的事情:
docker rm $(docker ps -aq | tail -n +4)
最后,在我的简化示例中,我们一次只处理一个存储库,但是如果您有更多的存储库,您可以使用相同的思想来变得更复杂一些。假设我只想保留some_repo/some_image中的最后三张图像。我只需要混合grep和awk就可以了:
docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)
同样,同样的想法也适用于容器,但到这里你已经明白了,所以我就不举例子了。
#!/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