Docker正在大量使用,但是没有任何Docker容器


166

我一直在使用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

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


7
docker使用引用计数来检查卷是否仍在使用中;这些都是在内存中完成的;这可能是错误或竞态条件,导致容器被删除,但计数器未更新。重新启动守护程序可以解决此问题,但是,是的,有可能某个地方存在错误。您的设置中有什么特别的东西(例如,您是否在使用docker-in-docker,Swarm?)。您是否使用某些脚本或工具来清理容器?
thaJeztah'1

5
嘿,谢谢@thaJeztah重新启动Docker守护进程(sudo service docker stopsudo service docker start)为我清除了所有这些虚假卷。而且,似乎我现在可以使用docker rm -v命令删除卷而不会出现问题。用法上的唯一显着差异是,我一直在Ubuntu 15.10上使用docker-compose。如果我能够重现此问题,我会报告,但否则,看起来像是简单的重新启动就足够了。谢谢!
Tkwon123 '16

2
即使重新启动后,它仍然说,码头工人正在使用卷..
霍尔姆斯

10
如果使用docker compose,则可以在down命令中添加-v来删除卷。
Niels Bech Nielsen

5
我通过停止docker然后从文件系统中删除卷并再次启动docker来解决此问题。service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
jfgrissom

Answers:


169

您可以使用以下功能来残酷地删除与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清理也很有用。请记住,这不仅会删除映像,不仅会删除容器(无论是否运行)和任何类型的卷。


3
根据问题,docker volume rm命令失败。根据评论,解决方案似乎是重新启动docker守护程序以修复引用计数。
BMitch

2
:如果通过的意见仔细阅读,这是不是该解决方案@BMitcheven after reboot it still says docker volume is in use..
大卫·冈萨雷斯·鲁伊斯

1
霍尔姆斯似乎有一个不同的问题,而不是发布这个问题的人。在上面查找一条评论。
BMitch

10
该gonsales,👏for功能名称,但其拼写armageddon
约瑟夫·希迪

1
这没有解决我的问题。docker-compose down --volumes不过使用了(由@Robert K. Bell建议)
BiAiB


58

我是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版本。


由于某种原因,我不得不做两次才能生效。
mameluc '18

1
我必须先执行“ docker system prune”,然后执行“ docker volume rm volume_name”。由于某些原因,请删除已经删除的容器。困惑的
马修·赖德out


9

只要卷与容器关联(正在运行或未运行),就无法将其删除。

你必须跑

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

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

如果该卷已安装到任何一个容器上,则应在inspect命令输出的“安装”部分中看到它。像这样的东西:

"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>


1
为了获得有用的答案,需要扩展此反应。添加有关如何检查此信息。
Jeroen Heier

1
我敢打赌docker container prune在大多数情况下必须足够。
x-yuri

6

目前,您可以使用docker现在提供的功能进行常规和更彻底的清洁:

docker system prune

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

docker system prune -a

3

我非常确定这些卷实际上已安装在您的系统上。查看/ proc / mounts,您将在那里看到它们。您可能需要sudo umount <path>sudo umount -f -n <path>。您应该能够在/ proc / mounts或通过以下方式获得安装路径docker volume inspect


-3

您应该使用标志-f(force)键入以下命令:

sudo docker volume rm -f <VOLUME NAME>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.