我在 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
图像。
docker info
显示图片的实际数量,您可以尝试 ./docker images -a -q | sort | uniq | wc -l
它应该是相同的结果(-a 表示所有图像,-q 仅表示 id)。 docker ps
仅显示活动容器,您可以执行 docker ps -a
列出所有容器
-D
选项和客户端启动 docker 守护程序吗? docker -d -D& ; docker -D rmi <id>
。你也可以试试CID=$(docker run -d ubuntu bash); ID=$(docker commit $CID); docker rmi $ID
吗?
试试 docker rmi node
。那应该行得通。
查看所有创建的容器就像 docker ps -a
一样简单。
要删除所有现有容器(不是图像!)运行 docker rm $(docker ps -aq)
以下是一些删除 docker 镜像/容器的方法:
删除单个图像
docker rmi image_name:version/image-id
删除所有图像
docker rmi $(docker images -qf "dangling=true")
杀死容器并移除它们:
docker rm $(docker kill $(docker ps -aq))
注意:将 kill
替换为 stop
以正常关闭
删除除“my-image”之外的所有图像
使用 grep 删除除 my-image
和 ubuntu
之外的所有内容
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))
docker rmi $(docker images -qf "dangling=true")
docker rm $(docker kill $(docker ps -a -q))
docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))
删除所有 docker 容器
docker rm $(docker ps -a -q)
删除所有 docker 镜像
docker rmi $(docker images -q)
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
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}")
使用镜像 ID 从 Docker 中删除镜像:
获取所有Images的列表 docker images 标识你要删除的镜像的镜像ID,例如:REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE kweku360/java latest 08d3a9b8e166 2 week ago 5.733 GB`最后使用镜像ID删除镜像(只需要前三位)docker rmi 08d
图片:
列出图片 docker images 移除一张图片 docker rmi image_name 强制移除一张图片 docker rmi -f image_name
容器:
列出所有容器 docker ps -a 删除一个容器 docker rm container_id 强制删除一个容器 docker rm -f container_id
更新,正如 VonC 在 How to remove old Docker containers 中所评论的那样。
使用 Docker 1.13(2016 年第四季度),您现在拥有:
docker system prune
将删除所有未使用的数据(即,依次为:容器停止、没有容器的卷和没有容器的图像)。
请参阅 PR 26108 和 commit 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
移除容器
删除特定容器 docker rm CONTAINER_ID CONTAINER_ID 对于单个图像 docker rm 70c0e19168cf 对于多个图像 docker rm 70c0e19168cf c2ce80b62174 删除退出的容器 docker ps -a -f status=exited 删除所有容器 docker ps -q -a | xargs 码头工人 rm
删除图像
docker rmi IMAGE_ID
删除单个图像的特定图像 docker rmi ubuntu 用于多个图像 docker rmi ubuntu alpine 删除悬空图像 悬空图像是与任何标记图像无关的层,因为 Docker 图像由多个图像组成。 docker rmi -f $(docker images -f dangling=true -q) 删除所有 Docker 镜像 docker rmi -f $(docker images -a -q)
删除卷
要列出卷,请运行 docker volume ls
删除特定卷 docker volume rm VOLUME_NAME 删除悬空卷 docker volume rm $(docker volume ls -f dangling=true -q) 删除容器及其卷 docker rm -v CONTAINER_NAME
CONTAINER_ID
?
docker rm container_name
docker rmi image_name
docker help rm 移除一个或多个容器 rmi 移除一个或多个图像
docker rmi 91c95931e552
来自守护进程的错误响应:冲突,无法删除 91c95931e552,因为容器 76068d66b290 正在使用它,使用 -f 强制 FATA[0000] 错误:无法删除一个或多个图像
查找容器 ID,
# docker ps -a
# docker rm daf644660736
daf644660736
?这与之前的任何一个有什么关系?
首先,我们必须停止并删除与我们要删除的 Docker 映像附加的 Docker 容器。
所以为此,首先
docker stop container-id - 停止正在运行的容器
docker rm container-id - 删除/移除容器
然后,
docker rmi image-id - 删除/移除镜像
对于 1.13 及更高版本:
docker image rm [OPTIONS] IMAGE [IMAGE...]
比较:
docker image rm 的文档和
docker rmi 的文档,
[OPTIONS]
似乎没有区别。
--force , -f Force removal of the image
--no-prune Do not delete untagged parents
CLI 重组 在 Docker 1.13 中,我们将每个命令重新组合到与之交互的逻辑对象下。例如,容器的列表和启动现在是 docker 容器的子命令,而历史记录是 docker 映像的子命令。这些更改让我们可以清理 Docker CLI 语法、改进帮助文本并使 Docker 更易于使用。旧的命令语法仍受支持,但我们鼓励大家采用新的语法。
Docker 提供了一些命令来删除 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)
此外,您还可以使用过滤器参数一次删除一组图像:
例子:
$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 步:杀死所有容器
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,以防您收到错误说由于子依赖项而无法删除它
如果您想自动/定期清理已退出的容器并删除正在运行的容器未使用的映像和卷,您可以下载映像 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
这是一个用于删除标记(命名)图像及其容器的 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
使其在无匹配容器情况下工作。
在我的情况下,问题是我有两个同名的图像解决方案是在名称或 id 之后添加标签
sudo docker rmi <NAME>:<TAG>
前任:
sudo docker rmi php:7.0.4-fpm
为什么没有人提到docker-compose
!我才用了一个星期,没有它我活不下去。你所需要的只是编写一个只需要几分钟学习的 yml,然后你就可以开始了。它可以启动镜像、容器(在所谓的服务中需要这些)并让您查看日志,就像您使用 docker 本机命令一样。试试看:
docker-compose up -d
docker-compose down --rmi 'local'
在使用 docker-compose 之前,我编写了自己的 shell 脚本,然后我必须在需要时自定义脚本,尤其是在应用程序架构发生变化时。现在我不必再这样做了,多亏了 docker-compose。
docker-compose
是一种编排工具,通常不适合在简单项目中使用。在这个问题的上下文中,独立的 docker
解决方案(不需要使用经常使用的 docker-compose.yml
配置)更可取。此外,这里已经有很多 很多 好的答案。
对我来说,以下工作正常:
> 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
列表图像:
ahanjura@ubuntu:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE 88282f8eda00 19 seconds ago 308.5 MB 13e5d3d682f4 19 hours ago 663 MB busybox2 latest 05fe66bb1144 20 hours ago 1.129 MB ubuntu 16.04 00fd29ccc6f1 5 days ago 110.5 MB ubuntu 14.04 67759a80360c 5 days ago 221.4 MB python 2.7 9e92c8430ba0 7 days ago 680.7 MB busybox 最新 6ad733544a63 6 周前 1.129 MB ubuntu 16.10 7d3f705d307c 5 个月前 106.7 MB
删除图像:
ahanjura@ubuntu:~$ sudo docker rmi 88282f8eda00
Deleted: sha256:88282f8eda0036f85b5652c44d158308c6f86895ef1345dfa788318e6ba31194 Deleted: sha256:4f211a991fb392cd794bc9ad8833149cd9400c5955958c4017b1e2dc415e25e9 Deleted: sha256:8cc6917ac7f0dcb74969ae7958fe80b4a4ea7b3223fc888dfe1aef42f43df6f8 Deleted: sha256:b74a8932cff5e61c3fd2cc39de3c0989bdfd5c2e5f72b8f99f2807595f8ece43
ahanjura@ubuntu:~$ sudo docker rmi 13e5d3d682f4
来自守护程序的错误响应:冲突:无法删除 13e5d3d682f4(必须强制)- 已停止的容器 5593e25eb638 正在使用图像
强制删除:
ahanjura@ubuntu:~$ sudo docker rmi -f 13e5d3d682f4
Deleted: sha256:13e5d3d682f4de973780b35a3393c46eb314ef3db45d3ae83baf2dd9d702747e Deleted: sha256:3ad9381c7041c03768ccd855ec86caa6bc0244223f10b0465c4898bdb21dc378 Deleted: sha256:5ccb917bce7bc8d3748eccf677d7b60dd101ed3e7fd2aedebd521735276606af Deleted: sha256:18356d19b91f0abcc04496729c9a4c49e695dbfe3f0bb1c595f30a7d4d264ebf
docker ps -aq | Foreach-Object { docker stop $_; docker rm $_; }