“ docker container prune”和“ docker rm $(docker container ls -aq)”和有什么区别?

时间:2020-08-31 13:31:17

标签: docker

我正在阅读Docker文档,但我不了解它们之间的区别:

docker container prune

docker rm $(docker container ls -aq)

请注意,在链接中,我列出的第二个命令是docker rm $(docker ps -a -q),但这与我编写的命令没有区别。 container ls只是ps命令的newer version

这两个命令似乎都删除了所有停止的容器。不仅如此,还是仅仅是同义词?

3 个答案:

答案 0 :(得分:3)

我认为没有实质性差异。尽管-a表示列出所有容器,结果docker rm ...还将尝试删除运行中的容器。这给出了您在下面看到的错误:

守护程序的错误响应:您无法删除正在运行的容器[...]尝试删除或强制删除之前,请先停止容器

示例

$ docker container run --rm -itd alpine:latest 
0ec4d7459d35749ecc24cc5c6fd748f4254b0782f73f1ede76cf49b1fc53b2d4

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0ec4d7459d35        alpine:latest       "/bin/sh"           4 seconds ago       Up 1 second                             jovial_ritchie

$ docker rm $(docker container ls -aq)
Error response from daemon: You cannot remove a running container 0ec4d7459d35749ecc24cc5c6fd748f4254b0782f73f1ede76cf49b1fc53b2d4. Stop the container before attempting removal or force remove

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

但是...使用--force-f时有所不同:

在这种情况下,命令执行2项不同的操作:

  • docker rm -f ... 强制删除正在运行的容器(使用SIGKILL),这意味着它将删除正在运行的容器。

    $ docker rm -f $(docker container ls -aq)
    0ec4d7459d35
    
  • docker container prune -f将删除所有已停止的容器而不要求确认(不会打印[y/N]提示)。

    $ docker container prune -f
    Total reclaimed space: 0B
    

答案 1 :(得分:2)

这两个命令的效果确实相似,但是有一些细微差别需要考虑:

  • docker container prune可以与--filter选项一起使用。
  • docker container prune具有同步保护功能,该功能可阻止守护程序同时执行prune
  • docker container prune尝试仅删除未运行的容器,而不是尝试删除所有容器并依靠守护程序为未停止的容器抛出异常,因此速度更快且不会产生不必要的异常错误日志,以防有人跟踪守护程序日志。
  • docker container prune在执行结束时生成报告,并提供回收空间。该报告将添加到daemon.EventsService中,并隐式显示在屏幕上。
  • docker container prune较短

在此答案的最后,我有一个问题:为什么有人会再输入15个字符以获得相同的结果或更糟?

答案 2 :(得分:0)

docker system prune -f:删除所有停止的容器(泊坞窗不要触摸正在运行的容器)

docker system prune -a:删除所有停止的容器(docker不要触摸正在运行的容器)和未使用的图像

docker rm <container_id>:删除特定的容器,应在(docker stop <container_id>)之前将其停止

相关问题