在长时间运行Docker时,系统中存在大量的镜像。如何一次安全地删除所有未使用的Docker映像以释放存储空间?

另外,我还想删除几个月前拉的图片,这些图片有正确的TAG。

因此,我并不是只要求删除未标记的图像。我正在寻找一种方法来删除一般不使用的图像,其中包括未标记和其他图像,如几个月前拉正确的TAG。


当前回答

我最近写了一个脚本在我的服务器上解决这个问题:

#!/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

其他回答

我通常做docker rm -f $(docker ps -a -q)和docker系统修剪清除所有悬挂容器。

这招对我很管用:

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

第二次更新(2017-07-08)

参考(再次)VonC,使用更近期的系统修剪。不耐烦的人可以使用-f,——force选项跳过提示符:

docker system prune -f

没有耐心和鲁莽的人还可以使用-a,——all选项删除“未使用的图像,而不仅仅是悬垂的图像”:

docker system prune -af

https://docs.docker.com/engine/reference/commandline/system_prune/

更新

参考VonC的答案,它使用了最近添加的修剪命令。下面是对应的shell别名方便:

alias docker-clean=' \
  docker container prune -f ; \
  docker image prune -f ; \
  docker network prune -f ; \
  docker volume prune -f '

旧的答案

删除停止(退出)的容器:

$ docker ps --no-trunc -aqf "status=exited" | xargs docker rm

删除未使用的(悬空的)图像:

$ docker images --no-trunc -aqf "dangling=true" | xargs docker rmi

如果您对不可撤销的数据丢失非常谨慎,那么您可以删除未使用的(悬空)卷(v1.9及以上版本):

$ docker volume ls -qf "dangling=true" | xargs docker volume rm

下面是一个方便的shell别名:

alias docker-clean=' \
  docker ps --no-trunc -aqf "status=exited" | xargs docker rm ; \
  docker images --no-trunc -aqf "dangling=true" | xargs docker rmi ; \
  docker volume ls -qf "dangling=true" | xargs docker volume rm'

参考文献

Docker ps -f 码头工人rm Docker images -f 码头工人rmi Docker v1.9.0版本说明 Docker卷ls Docker卷rm

几周前移除旧容器。

Docker rm $(Docker ps -a | grep "weeks" | awk '{打印$1;}”)

几周前删除旧图像。小心些而已。这将删除几周前创建的基本图像,但您的新图像可能会使用这些图像。

Docker rmi $(Docker images | grep 'weeks' | awk '{打印$3;}”)

如果您希望自动/定期清理退出的容器,并删除运行中的容器不使用的映像和卷,您可以下载映像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