#!/bin/bash
# remove not running containers
docker rm $(docker ps -f "status=exited" -q)
declare -A used_images
# collect images which has running container
for image in $(docker ps | awk 'NR>1 {print $2;}'); do
id=$(docker inspect --format="{{.Id}}" $image);
used_images[$id]=$image;
done
# loop over images, delete those without a container
for id in $(docker images --no-trunc -q); do
if [ -z ${used_images[$id]} ]; then
echo "images is NOT in use: $id"
docker rmi $id
else
echo "images is in use: ${used_images[$id]}"
fi
done
#!/bin/bash -x
## Removing stopped container
docker ps -a | grep Exited | awk '{print $1}' | xargs docker rm
## If you do not want to remove all container you can have filter for days and weeks old like below
#docker ps -a | grep Exited | grep "days ago" | awk '{print $1}' | xargs docker rm
#docker ps -a | grep Exited | grep "weeks ago" | awk '{print $1}' | xargs docker rm
## Removing Dangling images
## There are the layers images which are being created during building a Docker image. This is a great way to recover the spaces used by old and unused layers.
docker rmi $(docker images -f "dangling=true" -q)
## Removing images of perticular pattern For example
## Here I am removing images which has a SNAPSHOT with it.
docker rmi $(docker images | grep SNAPSHOT | awk '{print $3}')
## Removing weeks old images
docker images | grep "weeks ago" | awk '{print $3}' | xargs docker rmi
## Similarly you can remove days, months old images too.
#!/bin/bash
# Remove all the dangling images
DANGLING_IMAGES=$(docker images -qf "dangling=true")
if [[ -n $DANGLING_IMAGES ]]; then
docker rmi "$DANGLING_IMAGES"
fi
# Get all the images currently in use
USED_IMAGES=($( \
docker ps -a --format '{{.Image}}' | \
sort -u | \
uniq | \
awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \
))
# Get all the images currently available
ALL_IMAGES=($( \
docker images --format '{{.Repository}}:{{.Tag}}' | \
sort -u \
))
# Remove the unused images
for i in "${ALL_IMAGES[@]}"; do
UNUSED=true
for j in "${USED_IMAGES[@]}"; do
if [[ "$i" == "$j" ]]; then
UNUSED=false
fi
done
if [[ "$UNUSED" == true ]]; then
docker rmi "$i"
fi
done
20 回答
@VonC已经给出了一个非常好的答案,但是为了完整性,这里有一个我一直在使用的小脚本---如果你有一些东西,它还会破坏任何差事Docker进程:
要删除超过一个月的 old tagged 图像:
请注意,它将无法删除容器使用的图像,在存储库中引用,具有依赖子图像...这可能是您想要的 . 否则只需添加
-f
标志 ./etc/cron.daily/docker-gc
脚本示例:偶尔我遇到了Docker将分配并继续使用磁盘空间的问题,即使空间未分配给任何特定映像或现有容器 . 我不小心生成这个问题的最新方法是在RHEL 7.1中使用“docker-engine”centos build而不是“docker” . 似乎发生的事情有时是容器清理没有成功完成,然后空间永远不会被重复使用 . 当我分配为/ var / lib / docker文件的80GB驱动器时,我不得不想出一个创造性的方法来解决这个问题 .
这就是我想出的 . 首先解决磁盘已满错误:
停止docker:systemctl停止docker
分配了一个新的驱动器作为say / mnt / docker安装 .
将/ var / lib / docker中的所有文件移动到/ mnt / docker . 我使用命令:rsync -aPHSx --remove-source-files / var / lib / docker / / mnt / docker /
将新驱动器挂载到/ var / lib / docker .
此时我不再有磁盘完全错误,但我仍然浪费了大量的空间 . 接下来的步骤是要处理这个问题 .
启动Docker:systemctl启动docker
保存所有图像:docker save $(docker images | sed -e '/^/d' -e '/^REPOSITORY/d' -e's,[] [],:,' -e ' s,[] . ,,')> /root/docker.img
卸载docker .
清除/ var / lib / docker中的所有内容:rm -rf / var / lib / docker / [cdintv] *
重新安装docker
启用docker:systemctl enable docker
启动docker:systemctl启动docker
恢复图像:docker load </root/docker.img
启动您需要运行的任何持久性容器 .
这使我的磁盘使用率从docker的67 GB减少到docker的6 GB .
我不建议日常使用 . 但是,当看起来docker已经丢失了使用过的磁盘空间来处理软件错误或意外重启时运行是很有用的 .
我正在使用此命令:
这将删除创建时间大于10周前的所有图像 .
如果您希望自动/定期清理已退出的容器并删除正在运行的容器未使用的图像和卷,则可以下载图像
meltwater/docker-cleanup
.赶紧跑:
默认情况下,它每30分钟运行一次 . 但是,您可以使用此标志以秒为单位设置延迟时间(DELAY_TIME = 1800选项) .
更多细节:https://github.com/meltwater/docker-cleanup/blob/master/README.md
这对我有用:
其他答案很棒,具体来说:
但是我在两个命令的中间需要一些东西,所以我需要
filter
选项:希望有所帮助:)
供参考:https://docs.docker.com/config/pruning/#prune-images
假设你有Docker 1.13或更高,你可以使用prune命令 . 对于专门用于删除旧图像的问题,您需要第一个 .
我建议 not 习惯使用
docker system prune
命令 . 我估计用户会不小心删除他们主要使用docker image prune
和docker container prune
命令的内容 .到目前为止(Docker版本1.12),我们使用以下命令删除所有正在运行的容器 . 此外,如果我们要删除卷,我们可以使用以下命令中的相应标记-v手动执行此操作 .
Delete all Exited Containers
Delete all Stopped Containers
Delete All Running and Stopped Containers
Remove all containers, without any criteria
但是,在1.13及更高版本中,对于完整的系统和清理,我们可以直接使用以下命令:
所有未使用的容器,图像,网络和卷都将被删除 . 我们也可以使用以下清理单个组件的命令来执行此操作:
docker system prune -a
(系统会要求您确认该命令 . 如果您知道自己在做什么,请使用
-f
强行运行 . )更新第二个(2017-07-08):
使用更新的
system prune
(再次)参考VonC . 不耐烦的人可以使用-f, --force
选项跳过提示:不耐烦和鲁莽可以使用
-a, --all
选项另外删除"unused images not just the dangling ones":https://docs.docker.com/engine/reference/commandline/system_prune/
更新:
请参阅VonC's answer,它使用最近添加的
prune
命令 . 这是相应的shell别名方便:老答案:
删除已停止(已退出)的容器:
删除未使用的(悬空)图像:
如果您对 irrevocable data loss 行使 extreme caution ,那么您可以删除未使用的(悬空)卷(v1.9及以上版本):
在这里,它们是一个方便的shell别名:
参考文献:
docker ps -f
docker rm
docker images -f
docker rmi
Docker v1.9.0 release notes
docker volume ls
docker volume rm
要删除没有容器运行的标记图像,您将不得不使用一个小脚本:
How to remove a tagged image
docker rmi首先是标签
docker rmi图片 .
#可以在一个docker rmi调用中完成,例如:#docker rmi <repo:tag> <imageid>
(这适用于2016年11月,Docker版本1.12.2)
例如
例如脚本删除超过2周的任何内容 .
几个星期前删除旧容器 .
docker rm $(docker ps -a | grep "weeks" | awk '{ print $1; }')
几周前删除旧图像 . 小心 . 这将删除几周前创建但您的新图像可能正在使用的基本图像 .
docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')
如果要删除X个月前提取的图像,可以尝试以下示例删除三个月前创建的图像:
麻雀插件docker-remove-dangling-images可以用来清理已停止的容器和未使用的(悬空)图像:
$ sparrow plg run docker-remove-dangling-images
它适用于Linux和Windows操作系统 .
这是一个清理Docker镜像并回收空间的脚本 .
原始剧本
https://github.com/vishalvsh1/docker-image-cleanup
通常,Docker会保留与图像构建和图层相关的所有临时文件
/var/lib/docker
此路径是系统的本地路径,通常位于根分区 "/" .
您可以安装更大的磁盘空间并将
/var/lib/docker
的内容移动到新的安装位置并创建符号链接 .这样,即使Docker镜像占用空间,它也不会影响您的系统,因为它将使用其他一些安装位置 .
原帖:Manage Docker images on local disk
要么
2016年9月更新:Docker 1.13:PR 26108和commit 86de7c0引入了一些新命令,以帮助显示Docker守护程序数据在磁盘上占用的空间,并允许轻松清理"unneeded"多余的空间 .
docker system prune将删除所有悬空数据(即按顺序:容器停止,没有容器的卷和没有容器的图像) . 即使是未使用的数据,也可以使用
-a
选项 .你还有:
docker container prune
docker image prune
docker network prune
docker volume prune
对于未使用的图像,请使用
docker image prune -a
(用于删除悬空和未图像的图像) .警告:'unused'表示"images not referenced by any container":在使用
-a
之前要小心 .如A L的answer所示,
docker system prune --all
将删除所有未使用的图像,而不仅仅是悬空图像...这可能有点太多了 .将
docker xxx prune
与--filter option相结合可能是限制修剪的好方法(docker SDK API 1.28 minimum, so docker 17.04+)until (<timestamp>)
- 仅删除在给定时间戳之前创建的容器,图像和网络label
(label=<key>
,label=<key>=<value>
,label!=<key>
或label!=<key>=<value>
) - 仅使用(或不使用label!=...
)指定的标签移除容器,图像,网络和卷 .有关示例,请参阅“Prune images” .
原始答案(2016年9月)
我经常这样做:
我有alias for removing those [dangling images] 13:
drmi
这样,删除了标记图像不再引用的任何中间图像 .
我为exited processes (containers)做同样的 first
正如haridsv指出in the comments:
Jess Frazelle (jfrazelle)有bashrc function:
要删除旧图像,而不仅仅是"unreferenced-dangling"图像,您可以考虑docker-gc:
我最近在我的一台服务器上写了一个脚本来解决这个问题: