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

mar*_*man 5 docker

我正在阅读 Docker 文档,但我不明白以下之间的区别:

docker container prune

docker rm $(docker container ls -aq)

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

似乎这两个命令都删除了所有停止的容器。还有比这更多的东西吗,或者这些只是同义词?

tgo*_*gos 2

我认为没有实质性差异。但这-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
Run Code Online (Sandbox Code Playgroud)

但是...使用--force,时的区别:-f

在这种情况下,命令执行 2 件不同的事情:

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

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

    $ docker container prune -f
    Total reclaimed space: 0B
    
    Run Code Online (Sandbox Code Playgroud)

  • 此处找到的 Docker Engine 发行说明:[1.13.1 (2017-02-08)](https://docs.docker.com/engine/release-notes/prior-releases/) 指向此讨论:https:// /github.com/moby/moby/pull/26108 所以它必须是 2016 年底/2017 年初。 (2认同)
  • @NeoAnderson 在文档中你可以看到它需要 docker 1.25+,所以当时已正式发布,但正如 tgogos 指出的那样,它在 1.31.1 上很疯狂,我已经老了...... (2认同)