Docker清除除最新图像之外的特定类型的每个图像

enxuqcxy  于 2023-02-03  发布在  Docker
关注(0)|答案(2)|浏览(107)

我想自动化的Docker层只是不再使用,因为Docker喜欢吞噬硬盘空间的删除。
因此,我希望有一个脚本,将删除所有的图像的特定类型,除了最后使用的图像。

REPOSITORY          TAG                    IMAGE ID            CREATED             SIZE
mop-test-image      b4ffabd                a16fc65f4d19        10 minutes ago      1.95GB
mop-test-image      e7e5b14                7971bf4c01ce        17 minutes ago      1.95GB
mop-test-image      4325d4e                d6a3377f609a        32 minutes ago      1.95GB

因此,在上面的列表中,我想删除所有的图像,除了10分钟前创建的图像。
我目前使用这个来删除所有这类图像,所以它需要调整:

docker rmi $(docker images | grep test- | tr -s ' ' | cut -d ' ' -f 3)
bf1o4zei

bf1o4zei1#

使用until

docker image prune -a --force --filter "until=10m"

删除所有超过10分钟的图像
你也可以使用--filter使用repositoryID来选择某些类型的图像
查看更多here

inkz8wg9

inkz8wg92#

如果您对不需要知道截止日期的解决方案更感兴趣,下面的脚本应该可以做到这一点。
它只是循环遍历docker图像,如果以前没有见过图像,则将其名称存储在查找表中,否则将其删除。
https://gist.github.com/Mazyod/da92f8cda1783baa017f9323375c159c

#!/bin/bash

set -e

echo "Script for cleaning up Docker images"

# First, we grab a list of all images
docker_images=$(docker images --format "{{.ID}}|{{.Repository}}|{{.Tag}}")

# prepare a image name lookup
declare -A image_names

# Then, we loop through the list
while read -r line; do
    # We split the line into an array
    IFS='|' read -r -a array <<< "$line"

    # We grab the image ID
    image_id=${array[0]}

    # We grab the image name
    image_name=${array[1]}

    # We grab the image tag
    image_tag=${array[2]}

    # We check if the image_name has already been saved in image_names
    if [[ -z "${image_names[$image_name]}" ]]; then
        # If not, we save it
        echo "Keeping ${image_name}:${image_tag}"
        image_names[$image_name]=$image_id
    else
        # If yes, we remove the image
        echo "Removing ${image_name}:${image_tag}"
        docker rmi "${image_name}:${image_tag}"
    fi
done <<< "$docker_images"

相关问题