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

Tkw*_*123 118 docker docker-machine

我一直在使用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
Run Code Online (Sandbox Code Playgroud)

由于这些卷都不包含任何重要内容,因此我尝试使用清除所有卷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
Run Code Online (Sandbox Code Playgroud)

对于他们相当大的一部分.如果我首先没有任何容器,那么这些卷是如何使用的?

Dav*_*uiz 122

您可以使用这些函数粗暴地删除与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)
}
Run Code Online (Sandbox Code Playgroud)

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

armageddon
Run Code Online (Sandbox Code Playgroud)

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

  • gonsales,为函数名称,但拼写为```armageddon``` (9认同)
  • 这并没有解决我的问题。使用 `docker-compose down --volumes` 确实可以(正如 @Robert K. Bell 所建议的) (6认同)
  • 根据问题,`docker volume rm` 命令失败。从评论来看,解决方案似乎是重新启动 docker 守护进程来修复引用计数。 (3认同)
  • @BMitch 如果您仔细阅读评论,那不是解决方案:```即使在重新启动后它仍然说 docker volume is in use..``` (2认同)

Rob*_*ell 94

也许卷是通过docker-compose?创建的?如果是这样,它应该被删除:

docker-compose down --volumes
Run Code Online (Sandbox Code Playgroud)

感谢尼尔斯·比彻尼尔森!

  • 无论如何,只删除单个卷而不是所有卷? (7认同)
  • 可行:)值得注意的是,这也会删除所有容器本身。如果您更改了容器中的文件而不是永久安装而不在映像中,则这可能是不需要的。 (2认同)
  • 你刚刚拯救了我的一天。无论是武力还是其他选择都不起作用。这是因为这是由 compose 创建的配置,并且 compose 和 docker 读取这些 mouts 之间存在一些冲突 (2认同)
  • 只需确保您位于“docker-compose.yaml”所在的同一文件夹中。否则它将找不到卷名。但有效 - 谢谢! (2认同)
  • 如果您更改了撰写文件中的卷名称,则可能会导致出现孤立容器。docker 在控制台中打印出警告,您可以添加 ` --remove-orphans` 标志进行清理,然后您可以 rm 关联的卷 (2认同)
  • 大胖警告。这将删除 docker-compose 中的所有图像,因此请确保这是您想要执行的操作 (2认同)

Ben*_*est 51

我是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]$
Run Code Online (Sandbox Code Playgroud)

docker system prune

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

  • 我不得不做“docker system prune”然后“docker volume rm volume_name”。出于某种原因,修剪我已经删除的已删除容器。*使困惑*。 (2认同)

Rya*_*der 29

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

docker container prune
Run Code Online (Sandbox Code Playgroud)

那么您可以删除未使用的卷

docker volume prune
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,不知道为什么人们喜欢给出的答案 (6认同)
  • 是的,这应该是公认的答案。只有这个行动也对我有帮助。 (4认同)
  • 这绝对是所提出问题的答案。世界末日的剧本还是不错的。 (2认同)

小智 18

  1. 首先使用以下命令修剪不需要的容器:

    docker container prune
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 删除所有不需要的容器后,还可以使用以下命令修剪卷:

    docker volume prune
    
    Run Code Online (Sandbox Code Playgroud)


sha*_*kra 9

目前,您可以使用 docker 现在提供的功能进行一般和更完整的清洁:

docker system prune
Run Code Online (Sandbox Code Playgroud)

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

docker system prune -a
Run Code Online (Sandbox Code Playgroud)


Sup*_*ala 7

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

你必须跑

docker inspect <container-id>/<container-name>
Run Code Online (Sandbox Code Playgroud)

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

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

"Mounts": [
            {
                "Type": "volume",
                "Name": "user1",
                "Source": "/var/lib/docker/volumes/user1/_data",
                "Destination": "/opt",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
Run Code Online (Sandbox Code Playgroud)

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

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 容器修剪”在大多数情况下一定足够了。 (5认同)

Bar*_*ing 5

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

docker ps --all --format '{{.Names}}'  
Run Code Online (Sandbox Code Playgroud)

移除一个容器:

docker rm NAME
Run Code Online (Sandbox Code Playgroud)

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

docker volume ls
Run Code Online (Sandbox Code Playgroud)

删除音量:

docker volume remove VOLUME_NAME
Run Code Online (Sandbox Code Playgroud)