如何删除Docker的映像?


265

我有以下图像:

alex@alexvps:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              70c0e19168cf        5 days ago          1.069 GB
<none>              <none>              c2ce80b62174        8 days ago          399.2 MB
<none>              <none>              60afe4036d97        8 days ago          325.1 MB

当我尝试删除其中之一时,我得到:

alex@alexvps:~$ sudo docker rmi 60afe4036d97
Error: Conflict, 60afe4036d97 wasn't deleted
2014/01/28 00:54:00 Error: failed to remove one or more images

如何删除它们?为什么会有这样的冲突?

Answers:


478

为了删除所有图像,请使用给定命令

docker rmi $(docker images -q)

为了删除所有容器,请使用给定命令

docker rm $(docker ps -a -q)

警告:这将破坏您的所有图像和容器。将无法还原它们!

该解决方案由Techoverflow.net提供。


17
简单直接。另外,您在下面的命令中强制删除图像。'docker rmi -f $(
docker

37
Windows powershell等效于docker images -q | %{docker rmi -f $_}
BeatingToADifferentRobot

1
首先,我在@muheed How to Answerstackoverflow.com/a/30475249/2747020)上使用cmd 解锁了删除某些图像的操作:sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}
Razec Luar

1
用于Docker容器的Windows Powershelldocker ps -a -q | %{docker rm -f $_}
Dexter

1
如下面的@ alexyz78所述,您现在可以使用docker system prune。因此,抹平一切:docker kill $(docker ps -q)停止容器后再进行a操作docker system prune -a会删除所有内容-请参见stackoverflow.com/a/44309011/247708
Bharat

101

可能的原因: 原因可能是正在运行的容器当前正在使用此映像。在这种情况下,您可以列出正在运行的容器,停止相关的容器,然后删除该映像:

docker ps
docker stop <containerid>
docker rm <containerid>
docker rmi <imageid>

如果您无法通过docker ps找到容器,则可以使用它列出所有已退出的容器并将其删除。

docker ps -a | grep 60afe4036d97
docker rm <containerid>

注意: 请小心删除所有退出的容器,以防您使用Volume-Only容器。它们保持Exit状态,但包含有用的数据


实际上,您会收到一条消息,指出这一点。也许另一张图片基于此图片?尝试首先从该图像中删除您创建的所有图像。
qkrijger 2014年

12
我能够通过删除图像sudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm(感谢github.com/dotcloud/docker/issues/3258),然后使用sudo docker rmi 70c0e19168cf
alexyz78

2
小心删除Exit状态下的图像。如果使用的是仅数据卷容器,则它们不会保持运行状态。
aceofspades 2014年

1
awk可以grep:awk '/Exit/ {print $1}'
Dwight Spencer 2015年

您的命令将抛出此Error response from daemon: No such container: ...。很难说必须替换什么,以及应该替换什么。不要使用...
Felo Vilches

60

该错误的原因是,即使该图像没有任何标签,仍然在该图像上创建了一个可能处于exited状态的容器。因此,您需要确保已停止并删除在这些映像上创建的所有容器。以下命令可帮助您删除所有未运行的容器:

docker rm `docker ps -aq --no-trunc --filter "status=exited"`

现在,这将删除所有悬挂的非中间<none>图像:

docker rmi `docker images --filter 'dangling=true' -q --no-trunc`

注意:要停止所有正在运行的容器:

docker stop `docker ps -q`

1
谢谢你,我发现这是最干净的实现。
约瑟夫·索耶2014年

7
如果您有数据卷容器,请小心,因为它们的状态为“已退出”。这意味着您将丢失所有数据。
约翰

19

该图像当前可能由运行中的容器使用,因此您首先必须停止并卸下该容器。

docker stop <container-name>
docker rm <container-id>

然后,您可以尝试删除图像:

docker rmi <image-id>

您必须确保该图像不依赖于其他图像(否则必须先删除它们)。

我遇到了一个奇怪的案例,在该案例中,我不再有其他容器处于活动状态(不docker ps -a返回任何内容),但是我无法删除该图像及其图像相关性。

要解决这些特殊情况,您可以使用以下方法强制删除图像:

docker rmi -f <image-id>

19

在Bash中:

for i in `sudo docker images|grep \<none\>|awk '{print $3}'`;do sudo docker rmi $i;done

这将删除所有名称为“ <none>”的图像。我发现这些图像多余。


3
这不能回答问题,但仍然非常有用。谢谢。
binwiederhier 2014年

5
使此命令简单易用docker images|grep \<none\>|awk '{print $3}' | xargs docker rmi,可能需要sudo获得许可
蔡国瑞(Larry Cai)

15

我在以下命令中找到了答案:

docker images --no-trunc | grep none | awk '{print $3}' | xargs docker rmi

删除一些正在使用的图像时我遇到了您的问题,但我没有意识到(使用docker ps -a)。


9

从Docker版本开始。1.13.0(2017年1月)有以下system prune命令:

$ docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
-a, --all     Remove all unused images not just dangling ones
-f, --force   Do not prompt for confirmation
    --help    Print usage

7

除了Sunny的答案:

为了在PowerShell窗口中删除 Windows机器(使用Docker for Windows)上的所有映像,请执行以下操作:

docker images -q | %{docker rmi -f $_}

为了在PowerShell窗口中删除 Windows机器上的所有容器(使用Docker for Windows),请执行以下操作:

docker ps -a -q | %{docker rm -f $_}

6

首先,使用以下命令删除所有容器

sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}

然后,使用以下命令按其ID删除图像

sudo docker rmi <image-id>

值得注意的是,如果这对于某些人来说并不明显,它将删除所有正在运行的Docker容器。
Michael Mior 2015年


4

取出所有容器

docker ps -q -a | xargs docker rm

强制删除所有Docker映像

docker rmi -f $(docker images -f dangling=true -q)

4

只需--force在命令末尾添加即可。喜欢:

sudo docker rmi <docker_image_id> --force

为了使其更智能,您可以添加为:

sudo docker stop $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rm $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rmi $(docker images | grep <your_image_name> | awk '{print $3}') --force

在这里,在docker ps$ 1是第一列,即多克尔容器ID。

docker images$ 3是第三列,即泊坞窗图像ID。


3

删除所有未标记图像的命令最紧凑的版本是:

docker rmi $(docker images | grep "^<none>" | awk '{print $"3"}')

3

要删除某些Docker映像,您必须执行以下命令:

$ docker rmi <docker_image_id>

因此,要删除所有Docker映像,您可以执行以下命令:

$ docker rmi $(docker images -q)

现在,如果要删除所有Docker映像(包括正在使用的映像),则可以添加标志-f,例如:

$ docker rmi -f $(docker images -q)

3

docker image prune -all

要么

docker image prune -a

删除所有悬空的图像。如果-a指定,则还将删除所有容器未引用的所有图像。

注意:在修剪删除任何内容之前,系统会提示您进行确认,但是不会显示可能删除的内容的列表。另外,docker image ls它不支持负过滤,因此很难预测实际将删除哪些图像。

Docker的prune文档所述。


1

如果您想自动/定期清理退出的容器并删除正在运行的容器未使用的映像和卷,则可以下载Docker映像meltwater/docker-cleanup

这样,您就无需手工清理它。

赶紧跑:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

它将每30分钟运行一次(或使用DELAY_TIME = 1800选项设置的时间长),并清理退出的容器和图像。

更多详细信息:https : //github.com/meltwater/docker-cleanup/blob/master/README.md


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.