如何删除Docker的图像?

时间:2014-01-28 06:04:19

标签: docker

我有以下图片:

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

如何删除它们?为什么会出现这种冲突?

17 个答案:

答案 0 :(得分:460)

要删除所有图像,请使用给定的命令

docker rmi $(docker images -q)

要删除所有容器,请使用给定的命令

docker rm $(docker ps -a -q)

警告:这会破坏您的所有图像和容器。恢复它们是不可能的!

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

答案 1 :(得分:96)

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

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

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

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

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

答案 2 :(得分:59)

错误的原因是即使图像没有任何标记,仍然存在在该图像上创建的容器,该容器可能处于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`

答案 3 :(得分:19)

在Bash中:

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

这将删除名称为“&lt; none&gt;”的所有图像。我发现那些图像是多余的。

答案 4 :(得分:18)

图像当前可以由正在运行的容器使用,因此您首先必须停止并删除容器。

HTTPUtility.HtmlDecode

然后你可以尝试删除图像:

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

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

我有一个奇怪的情况,我没有更多的容器仍然存活(docker rmi <image-id> 没有返回任何内容)但我无法删除图像及其图像依赖。

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

docker ps -a

答案 5 :(得分:14)

我在这个命令中找到了答案:

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

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

答案 6 :(得分:9)

自Docker ver。 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 :(得分:6)

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

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

然后,使用以下命令

删除其ID
sudo docker rmi <image-id>

答案 8 :(得分:4)

您必须先停止/删除在该图像上创建的所有不必要的容器。

看看:How to remove old Docker containers

之后使用@marcell解决方案。

答案 9 :(得分:4)

删除所有容器

docker ps -q -a | xargs docker rm

强制删除所有Docker镜像

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

答案 10 :(得分:4)

除了Sunny的答案:

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

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

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

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

答案 11 :(得分: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是第一列,即Docker容器ID。

docker images $ 3是第三列,即Docker图像ID。

答案 12 :(得分:3)

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

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

答案 13 :(得分:2)

使用

docker image prune -all

docker image prune -a

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

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

Docker's documentation for prune中所述。

答案 14 :(得分:1)

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

$ docker rmi <docker_image_id>

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

$ docker rmi $(docker images -q)

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

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

答案 15 :(得分: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

答案 16 :(得分:0)

我找到了使用Powershell脚本的解决方案,它将为我解决这个问题。

该脚本首先停止所有容器,而不是删除所有容器,然后删除用户命名的图像。

看这里http://www.devcode4.com/article/powershell-remove-docker-containers-and-images