Docker 个正在使用中,但没有任何 Docker 个容器

Docker is in volume in use, but there aren't any Docker containers

编辑 (2/19/21):自从我几年前提出这个最初的问题以来,已经过去了很多时间,从那时起我看到了 activity 的一阵骚动。我重新选择了一个我认为与解决此问题的最本地化和最安全的选项一致的答案(通常与 docker-compose 相关联)。虽然 docker 确实引入了 prune 命令,但它通常是一个危险的操作,我会谨慎使用它,因为您可能会无意中影响计算机上的其他应用程序或设置


我在使用 Docker 1.9.1.

删除 Docker 卷时遇到问题

我已经删除了所有停止的容器,以便 docker ps -a returns 清空。

当我使用 docker volume ls 时,我得到了一大堆 Docker 个容器:

docker volume ls
DRIVER              VOLUME NAME
local               a94211ea91d66142886d72ec476ece477bb5d2e7e52a5d73b2f2f98f6efa6e66
local               4f673316d690ca2d41abbdc9bf980c7a3f8d67242d76562bbd44079f5f438317
local               eb6ab93effc4b90a2162e6fab6eeeb65bd0e4bd8a9290e1bad503d2a47aa8a78
local               91acb0f7644aec16d23a70f63f70027899017a884dab1f33ac8c4cf0dabe5f2c
local               4932e2fbad8f7e6246af96208d45a266eae11329f1adf176955f80ca2e874f69
local               68fd38fc78a8f02364a94934e9dd3b5d10e51de5b2546e7497eb21d6a1e7b750
local               7043a9642614dd6e9ca013cdf662451d2b3df6b1dddff97211a65ccf9f4c6d47
#etc x 50

由于这些卷中的 none 包含任何重要内容,我尝试用 docker volume rm $(docker volume ls -q) 清除所有卷。

在这个过程中,大部分都被删除了,但我回来了:

Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use

其中很大一部分。如果我一开始就没有任何容器,这些卷是如何使用的?

您可以使用这些功能来粗暴地删除所有 Docker 相关的内容:

removecontainers() {
    docker stop $(docker ps -aq)
    docker rm $(docker ps -aq)
}

armageddon() {
    removecontainers
    docker network prune -f
    docker rmi -f $(docker images --filter dangling=true -qa)
    docker volume rm $(docker volume ls --filter dangling=true -q)
    docker rmi -f $(docker images -qa)
}

您可以将它们添加到您的 ~/Xrc 文件中,其中 X 是您的 shell 解释器(~/.bashrc 如果您使用的是 bash)文件并通过重新加载它们执行 source ~/Xrc。此外,您可以将它们复制粘贴到控制台,然后(无论您之前为准备好功能而采取的选项如何)只需 运行:

armageddon

它对于一般 Docker 清理也很有用。请记住,这也会删除您的图像,不仅是您的容器(运行ning 与否)和任何类型的卷。

我很确定这些卷实际上已安装在您的系统上。查看 /proc/mounts,您会在那里看到它们。您可能需要 sudo umount <path>sudo umount -f -n <path>。您应该能够在 /proc/mounts 或通过 docker volume inspect

中获取安装路径

我是 Docker 的新手。我正在清理一些最初的测试混乱,也无法删除卷。我已经停止了所有 运行 个实例,执行了 docker rmi -f $(docker image ls -q),但仍然收到 Error response from daemon: unable to remove volume: remove uuid: volume is in use

我做了一个 docker system prune 它清理了删除最后一卷所需的内容:

[0]$ docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
... about 15 containers UUID's truncated

Total reclaimed space: 2.273MB
[0]$ docker volume ls
DRIVER              VOLUME NAME
local              uuid
[0]$ docker volume rm uuid
uuid
[0]$

docker system prune

The client and daemon API must both be at least 1.25 to use this command. Use the docker version command on the client to check your client and daemon API versions.

您应该使用标志 -f(强制)键入此命令:

sudo docker volume rm -f <VOLUME NAME>

也许该卷是通过 docker-compose 创建的?如果是这样,它应该get removed by:

docker-compose down --volumes

归功于 !

只要卷与容器关联(运行ning 与否),它们就不能被删除。

你必须运行

docker inspect <container-id>/<container-name>

在每个 running/non-running 容器上,该卷可能已安装到该容器上。

如果卷安装到任何一个容器上,您应该在 inspect 命令 输出的 Mounts 部分看到它。像这样:-

"Mounts": [
            {
                "Type": "volume",
                "Name": "user1",
                "Source": "/var/lib/docker/volumes/user1/_data",
                "Destination": "/opt",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

找出负责的容器后,使用:-

docker rm -f container-1 container-2 ...container-n 如果是运行宁容器

docker rm container-1 container-2 ...container-n 如果是非运行宁容器

从主机中完全删除容器。

然后尝试使用以下命令删除卷:-

docker volume remove <volume-name/volume-id>

其中一个已停止的容器正在使用卷。您可以通过命令删除此类容器:

docker container prune

然后您可以删除未使用的卷

docker volume prune

目前,您可以使用 docker 提供的内容进行更全面的全面清洁:

docker system prune

要另外删除任何已停止的容器和所有未使用的图像(不仅仅是悬挂图像),请将 -a 标志添加到命令中:

docker system prune -a

一个衬垫,为您提供所需的详细信息:

docker inspect `docker ps -aq` | jq '.[] | {Name: .Name, Mounts: .Mounts}' | less

搜索投诉量,容器名称你也有

您必须首先删除使用该卷的容器。 按名称列出所有容器,包括已存在的容器:

docker ps --all --format '{{.Names}}'  

删除一个容器:

docker rm NAME

删除容器后,您也可以删除卷。 列出卷:

docker volume ls

删除卷:

docker volume remove VOLUME_NAME
  1. 首先使用命令修剪不需要的容器:

    docker container prune
    

    (确保您确实要移除所有容器)

  2. 删除所有不需要的容器后,使用以下方法修剪卷:

    docker volume prune