如何在Docker中删除映像?


839

我在OS X 10.8.4(Mountain Lion)下的Vagrant下运行Docker,每当尝试删除已保存的映像时,都会出现错误:

$ docker rmi some-image-id
2013/07/15 hh:mm:ss unexpected JSON input

根据rmi帮助,正确的语法是docker rmi IMAGE [IMAGE...],我不确定该怎么做。

如何删除图像?

$ docker version
Client version: 0.4.8
Server version: 0.4.8
Go version: go1.1

 

$docker info
Containers: 1
Images: 3

有趣的是,当我运行时docker ps,根本没有容器出现。运行docker images显示四(4)base张图像和一(1)张node图像。


1
您正在使用哪个版本的Docker?您可以粘贴“ docker version”和“ docker info”的输出吗?我只是尝试与师父,它工作正常。
creack

我已经用该信息更新了问题。
Jules

1
docker info显示的是实际图像数量,您可以尝试./docker images -a -q | sort | uniq | wc -l将其结果相同(对于所有图像,均使用-a,对于id则仅使用-q)。docker ps只显示活动的容器,您可以docker ps -a列出所有容器
creack

您可以尝试使用-Doption和客户端启动docker daemon 吗?docker -d -D& ; docker -D rmi <id>。你也可以尝试CID=$(docker run -d ubuntu bash); ID=$(docker commit $CID); docker rmi $ID吗?
creack

4
看一下这个拉取请求:github.com/dotcloud/docker/pull/1225
creack

Answers:


1012

尝试docker rmi node。那应该工作。

看到所有创建的容器很简单docker ps -a

要删除所有现有的容器(不是图像!),请运行 docker rm $(docker ps -aq)


13
如果您的某些容器仍在运行,则可以运行:docker stop $(docker ps -qa)停止所有容器。我认为删除正在运行的容器可能行不通,至少我记得我对此有问题。我可能是错的……我已经检查了手册页,它支持我的假设:“ -f,--force = true | false强制删除正在运行的容器。默认值为false。”
Konrad Kleine 2014年

1
啊,我不知道“删除所有现有容器”的命令。自己写过:docker ps -a | sed -r's / ^(\ w +)。* / \ 1 / g'| sed -r's / ^ CONTAINER //'| sed -r's / ^(\ w +)/ docker rm \ 1 / g'| awk'system($ 0)'谢谢!
阿努拉格2015年

4
您知道当需要使用特定于Shell的功能来实现基本功能时,命令行选项的设计不正确。
user3467349

要删除所有现有映像,您可以使用-“ docker rmi $(docker images -q)”
人类,

要使用Windows docker ps -aq | Foreach-Object { docker stop $_; docker rm $_; }
Powershell

565

以下是删除Docker映像/容器的一些方法:

删除单张图片

docker rmi image_name:version/image-id

删除所有图片

docker rmi $(docker images -qf "dangling=true")

杀死容器并删除它们:

docker rm $(docker kill $(docker ps -aq))

注意:替换killstop的正常关闭

删除除“我的图像”以外的所有图像

使用grep删除所有除my-imageubuntu

docker rmi $(docker images | grep -v 'ubuntu\|my-image' | awk {'print $3'})

(无awk)

docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))


25
添加:删除“悬空”的图像(没有标签的图像):docker rmi $(docker images -qf "dangling=true")
kolypto

5
应该docker rm $(docker kill $(docker ps -a -q))
宝马

1
没有awk的“删除所有内容”:docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))
phobie

1
@kolypto尽管“ dangling = true”似乎最终没有删除非悬挂容器。再次运行,减去-f和dangling标志以除去其余部分。
DougW

1
是我一个人,还是最后一个建议(或(没有awk))没有真正的作用?
Mike Wise

195

删除所有Docker容器

docker rm $(docker ps -a -q)

删除所有Docker映像

docker rmi $(docker images -q)

7
删除未标记的图像:docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
巴雷特·克拉克

1
eq8.eu/blogs/23-spring-cleaning-for-webdevelopers sudo docker rmi -f $(sudo docker images | grep "<none>" | awk "{print \$3}"),然后删除2015年的实时发布标签(例如live-20150121223),我们可以这样做 sudo docker rmi -f $(sudo docker images | grep live-2015 | awk "{print \$3}")
等效

要强制它,您必须写:docker -f rm $(docker ps -a -q)
Adrian Lopez

70

要使用映像ID从Docker移除映像:

  1. 获取所有图像的列表

    docker images
    
  2. 标识要删除的图像的图像ID,例如:

    REPOSITORY     TAG     IMAGE ID        CREATED        VIRTUAL SIZE
    kweku360/java  latest  08d3a9b8e166    2 weeks ago         5.733 GB`
    
  3. 最后,使用图片ID删除图片(仅需要前三位)

    docker rmi 08d
    

1
首先需要停止容器并将其卸下,请参阅stackoverflow.com/questions/21398087/…–
vikramvi

37

图片:

  1. 列出图片

    码头工人图像

  2. 删除一张图片

    泊坞窗rmi image_name

  3. 强制删除一张图像

    泊坞窗rmi -f image_name

容器:

  1. 列出所有容器

    泊坞窗ps -a

  2. 取出一个容器

    码头工人rm container_id

  3. 强制取出一个容器

    泊坞窗rm -f container_id


29

如VonC在如何删除旧的Docker容器中所述,进行了更新

借助Docker 1.13(2016年第四季度),您现在拥有:

docker system prune 将删除所有未使用的数据(即,顺序为:容器停止,无容器的卷和无容器的映像)。

请参阅PR 26108commit 86de7c0,它们正在引入一些新命令,以帮助简化可视化Docker守护程序数据在磁盘上占用的空间并允许轻松清除“不需要的”多余空间。

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

感谢您提供详尽的答案,但这并不能直接回答原始问题(该问题已经被回答,并且其最高答案仍然有意义)。
2013年

2
我同意。但是,由于该问题的标题非常笼统,因此已经成为参考问题,因此我认为应该对该机制进行更新。
qkrijger '16

24

卸下容器

  1. 删除特定的容器

    docker rm CONTAINER_ID CONTAINER_ID
    
    • 对于单张图像

      docker rm  70c0e19168cf
      
    • 对于多个图像

      docker rm  70c0e19168cf c2ce80b62174
      
  2. 取出退出的容器

    docker ps -a -f status=exited
    
  3. 取出所有容器

    docker ps -q -a | xargs docker rm
    


移除影像

docker rmi IMAGE_ID
  1. 移除特定图片

    • 对于单个图像

      docker rmi ubuntu
      
    • 用于多个图像

      docker rmi ubuntu alpine
      
  2. 删除悬挂的图像
    悬挂的图像是与任何标记的图像都没有关系的图层,因为Docker图像由多个图像组成。

    docker rmi -f $(docker images -f dangling=true -q)
    
  3. 删除所有Docker映像

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

删除卷

要列出卷,请运行 docker volume ls

  1. 删除特定的卷

    docker volume rm VOLUME_NAME
    
  2. 删除悬空的卷

    docker volume rm $(docker volume ls -f dangling=true -q)
    
  3. 删除容器及其卷

    docker rm -v CONTAINER_NAME
    

为什么要加倍CONTAINER_ID
彼得·莫滕森

19

docker rm container_name

docker rmi image_name

docker help

rm取出一个或多个容器

rmi删除一个或多个图像


谢谢,但是这个问题已经有几个答案和一个选定的答案,大约在3年前就解决了这个问题。
Jules

13
docker rmi  91c95931e552

来自守护程序的错误响应:冲突,无法删除91c95931e552,因为容器76068d66b290正在使用它,请使用-f强制FATA [0000]错误:无法删除一个或多个图像

查找容器ID,

# docker ps -a

# docker rm  daf644660736 

这是问题的答案吗?
彼得·莫滕森

为什么daf644660736呢 那与以前的任何关系如何?
彼得·莫滕森

5

首先,我们必须停止并删除将要删除的Docker映像附带的Docker容器。

因此,首先

  • docker stop container-id -停止正在运行的容器
  • docker rm container-id -删除/删除容器

然后,

  • docker rmi image-id -删除/删除图像

3

对于1.13及更高版本:

docker image rm [OPTIONS] IMAGE [IMAGE...]

比较:

[OPTIONS]似乎没有什么区别。

--force , -f        Force removal of the image
--no-prune          Do not delete untagged parents

来自:Docker 1.13简介

重组CLI

在Docker 1.13中,我们将每个命令重新组合在一起,使其位于与其交互的逻辑对象下。例如liststart集装箱现在的子命令docker containerhistory是的子命令docker image

这些更改使我们可以清理Docker CLI语法,改进帮助文本并简化Docker的使用。仍然支持旧的命令语法,但是我们鼓励大家采用新的语法


3

Docker提供了一些删除命令images

显示/删除Images

docker images
docker images -a # All images
docker images --no-trunc # List the full length image IDs

docker images --filter "dangling=true" // Show unstage images
docker rmi $(docker images -f "dangling=true" -q) # Remove on unstages images

docker rmi <REPOSITORY> or <Image ID> # Remove a single image

docker image prune # Interactively remove dangling images
docker image prune -a # Remove all images

or 

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

另外,您还可以使用filter参数来一次删除一组图像:

例:

$docker images --filter "before=<hello-world>" // It will all images before hello-world

$docker images --filter "since=<hello-world>" // It will all images since hello-world

因此,您可以像这样删除该过滤器图像:

docker rmi $(docker images --filter "since=<hello-world>")
docker rmi $(docker images --filter "before=<hello-world>")

1

删除所有使用

步骤1:杀死所有容器

for i in `sudo docker ps -a | awk '{ print $1 }'`; do sudo docker kill $i ; done

步骤2:先将其RM

for i in `sudo docker ps -a | awk '{ print $1 }'`; do sudo docker rm $i ; done

步骤3:强制删除图像

for i in `sudo docker images | awk '{ print $3}'`; do  sudo docker rmi --force $i ; done

如果您收到错误消息说由于子依赖项而无法将其删除,请使用步骤1


1

如果您想自动/定期清理已退出的容器并删除正在运行的容器未使用的映像和卷,则可以下载映像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


1

这是一个Shell脚本,用于删除已标记(命名)的图像及其容器。另存为docker-rmi并使用'docker-rmi my-image-name'运行

#!/bin/bash

IMAGE=$1

if [ "$IMAGE" == "" ] ; then
  echo "Missing image argument"
  exit 2
fi

docker ps -qa -f "ancestor=$IMAGE" | xargs docker rm
docker rmi $IMAGE

您需要xargs -r使其在不匹配的容器中工作。
作为。

0

为什么没人提docker-compose!我刚刚使用了一个星期,没有它我将无法生存。您所需要的只是编写一个yml,仅需学习几分钟,然后就可以开始了。它可以引导映像,容器(在所谓的服务中是必需的),并让您像使用docker native命令一样查看日志。尝试一下:

docker-compose up -d
docker-compose down --rmi 'local'

在使用docker-compose之前,我编写了自己的shell脚本,然后必须在需要时自定义脚本,特别是在应用程序体系结构更改时。现在,由于docker-compose,我不再需要这样做。


docker-compose是一种编排工具,在简单项目中通常不切实际。在此问题的上下文中,最好docker使用独立的解决方案(不需要使用经常使用复杂的docker-compose.yml配置)。此外,这里已经有很多很好的答案。
Jules

@Jules没有人提到docker-compose并不意味着它们是错误的答案,也不意味着这也是一个无助的答案。Docker本机命令不错,但很乏味,并且每次都需要进行大量键入。“一个是好,两个是太多”。
蒂娜

-1

对我来说,以下工作正常:

> docker images
REPOSITORY   TAG           IMAGE ID          CREATED             SIZE
debian       jessie        86baf4e8cde9      3 weeks ago         123MB
ubuntu       yakkety       7d3f705d307c      3 weeks ago         107MB
alpine       3.5           074d602a59d7      7 weeks ago         3.99MB

然后继续通过运行以下命令来删除图像:

> docker rmi debian:jessie
> docker rmi ubuntu:yakkety
> docker rmi alipine:3.5

-1

列出图片:

ahanjura@ubuntu:~$ sudo docker images

存储库标记图像ID大小已创建88282f8eda00 19秒前308.5 MB 13e5d3d682f4 19小时前663 MB busybox2最新05fe66bb1144 20小时前1.129 MB ubuntu 16.04 00fd29ccc6f1 5天前110.5 MB ubuntu 14.04 67759a80360c 5天前221.4 busybox最新6ad733544a63 6周前1.129 MB ubuntu 16.10 7d3f705d307c 5个月前106.7 MB

删除图片:

ahanjura@ubuntu:~$ sudo docker rmi 88282f8eda00

删除:SHA256:88282f8eda0036f85b5652c44d158308c6f86895ef1345dfa788318e6ba31194删除:SHA256:4f211a991fb392cd794bc9ad8833149cd9400c5955958c4017b1e2dc415e25e9删除:SHA256:8cc6917ac7f0dcb74969ae7958fe80b4a4ea7b3223fc888dfe1aef42f43df6f8删除:SHA256:b74a8932cff5e61c3fd2cc39de3c0989bdfd5c2e5f72b8f99f2807595f8ece43

ahanjura@ubuntu:~$ sudo docker rmi 13e5d3d682f4

守护程序的错误响应:冲突:无法删除13e5d3d682f4(必须强制执行)-停止容器5593e25eb638正在使用映像

强行删除:

ahanjura@ubuntu:~$ sudo docker rmi -f 13e5d3d682f4

删除:SHA256:13e5d3d682f4de973780b35a3393c46eb314ef3db45d3ae83baf2dd9d702747e删除:SHA256:3ad9381c7041c03768ccd855ec86caa6bc0244223f10b0465c4898bdb21dc378删除:SHA256:5ccb917bce7bc8d3748eccf677d7b60dd101ed3e7fd2aedebd521735276606af删除:SHA256:18356d19b91f0abcc04496729c9a4c49e695dbfe3f0bb1c595f30a7d4d264ebf


-1

就我而言,问题是我必须拖曳同名的图像,解决方法是在名称或ID后面添加标签

sudo docker rmi <NAME>:<TAG>

例如:

sudo docker rmi php:7.0.4-fpm
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.