【问题标题】:Docker is in volume in use, but there aren't any Docker containersDocker 正在大量使用,但没有任何 Docker 容器
【发布时间】:2016-01-07 15:22:46
【问题描述】:

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


我在使用 Docker 1.9.1 删除 Docker 卷时遇到问题。

我已删除所有已停止的容器,以便 docker ps -a 返回空。

当我使用 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

由于这些卷都不包含任何重要内容,我尝试使用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 使用引用计数来检查卷是否仍在使用中;这一切都在内存中完成;这可能是某种错误或竞争条件,导致容器被删除,但计数器未更新。重新启动守护程序应该可以解决此问题,但是,是的,某处可能存在错误。您的设置中有什么特别之处吗(例如,您使用的是 docker-in-docker、Swarm 吗?)。您是否使用一些脚本或工具来清理您的容器?
  • 嘿,谢谢@thaJeztah 重新启动 Docker 守护程序(sudo service docker stopsudo service docker start)为我清除了所有这些幽灵卷。此外,似乎我现在可以使用 docker rm -v 命令毫无问题地删除卷。唯一显着的使用差异是我一直在 Ubuntu 15.10 上使用 docker-compose。如果我能够复制此问题,我会报告,否则似乎简单的重启就足够了。谢谢!
  • 即使重启后它仍然说 docker volume 正在使用中..
  • 如果你使用 docker compose,你可以在 down 命令中添加 -v 来删除卷。
  • 我通过停止 docker 然后从文件系统中删除卷并再次启动 docker 来解决此问题。 service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start

标签: docker docker-machine


【解决方案1】:

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

docker-compose down --volumes

感谢Niels Bech Nielsen

【讨论】:

  • 这行得通 :) 值得注意的是,这也会删除所有容器本身。如果您在容器中更改的文件不在永久挂载上且不在映像中,则这可能是不需要的。
  • 你刚刚拯救了我的一天。没有任何力量或其他选项起作用。是不是因为这是由 compose 创建的配置,并且 compose 和 docker 读取这些 mouts 之间存在一些冲突
  • 无论如何只删除单个卷而不是所有卷?
  • 请确保您位于docker-compose.yaml 所在的同一文件夹中。否则它将找不到卷名。但有效 - 谢谢!
  • 如果您更改了撰写文件中卷的名称,这可能会导致孤立容器。 docker 在控制台中打印了一个警告,您可以添加 `--remove-orphans` 标志进行清理,然后您可以 rm 关联的卷
【解决方案2】:

您可以使用这些函数来粗暴地删除与 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 清理也很有用。请记住,这也会删除您的图像,不仅是您的容器(无论是否正在运行)和任何类型的卷。

【讨论】:

  • 根据问题,docker volume rm 命令失败。从 cmets 看来,解决方案似乎是重新启动 docker 守护程序以修复引用计数。
  • @BMitch 如果您仔细阅读 cmets,这不是解决方案:even after reboot it still says docker volume is in use..
  • holms 似乎有不同的问题,并不是发布问题的人。查找上面的一条评论。
  • gonsales,?为函数名,但拼写为armageddon
  • 这并没有解决我的问题。虽然使用docker-compose down --volumes 确实(如@Robert K. Bell 所建议)
【解决方案3】:

卷可以被已停止的容器之一使用。您可以通过命令删除此类容器:

docker container prune

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

docker volume prune

【讨论】:

  • 这应该是公认的答案,不知道为什么人们喜欢给出的答案
  • 这绝对是所提出问题的答案。不过,世界末日脚本很不错。
  • 是的,这应该是公认的答案。只有这个动作对我也有帮助。
  • 这可以帮助我们(并挽救我的生命):)
【解决方案4】:

我对 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

客户端和守护程序 API 必须至少为 1.25 才能使用此命令。利用 客户端上的 docker version 命令检查您的客户端和守护程序 API 版本。

【讨论】:

  • 出于某种原因,我必须这样做两次才能奏效。
  • 我必须执行“docker system prune”,然后执行“docker volume rm volume_name”。出于某种原因,修剪我已经删除的已删除容器。 困惑
【解决方案5】:

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

你必须跑

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

在可能已安装此卷的每个运行/非运行容器上。

如果卷被安装到任何一个容器上,您应该在 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 &lt;volume-name/volume-id&gt;

【讨论】:

  • 为了得到一个有用的答案,这个反应需要扩展。添加有关如何检查的信息。
  • 我敢打赌 docker container prune 在大多数情况下都足够了。
【解决方案6】:

目前您可以使用 docker 现在提供的功能进行更全面的清洁:

docker system prune

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

docker system prune -a

【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      为您提供所需的详细信息的一个班轮:

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

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

      【讨论】:

      • 如果没有容器怎么办,即“docker ps -aq”不返回任何内容。我们如何找到挂载路径
      • docker volume inspect $(docker volume ls -q) | jq '.[] | {Name: .Name, Mountpoint: .Mountpoint}' 将为您提供卷的路径,无论它们是否被容器使用...
      【解决方案9】:
      1. 首先使用以下命令修剪不需要的容器:

        docker container prune
        

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

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

        docker volume prune
        

      【讨论】:

        【解决方案10】:

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

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

        移除容器:

        docker rm NAME
        

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

        docker volume ls
        

        移除音量:

        docker volume remove VOLUME_NAME
        

        【讨论】:

          【解决方案11】:

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

          sudo docker volume rm -f &lt;VOLUME NAME&gt;

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-09-24
            • 2020-05-14
            • 1970-01-01
            • 1970-01-01
            • 2019-02-13
            • 1970-01-01
            • 2022-11-13
            • 1970-01-01
            相关资源
            最近更新 更多