Docker Registry定期清理方式

 更新时间:2025年08月07日 09:23:41   作者:mofei12138  
Docker Registry因镜像堆积需定期清理,可通过配置文件开启删除、调用API、执行garbage-collect命令或Python脚本保留最新版本,并设置crontab定时任务自动化处理

背景

项目在持续部署过程中会push镜像到Registry中,随着时间推移,Registry中会保存大量镜像,造成磁盘空间不足,所以需要定期清理历史镜像,保证Registry服务正常运行。

删除镜像流程

  1. Registry默认是不允许删除镜像的,需要修改/etc/docker/registry/config.yml配置文件来开启删除操作,如下:
version: 0.1
log:
  fields:
    service: registry
storage:
    delete:
        enabled: true #打开delete开关
    cache:
        blobdescriptor: inmemory
    filesystem:
        rootdirectory: /var/lib/registry
http:
    addr: :5000
    headers:
        X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
  1. 调用Registry API删除镜像
# 查询digest
curl -I -H "Accept: application/vnd.docker.distribution.manifest.v2+json" localhost:5000/v2/nginx/manifests/latest
# 根据digest删除镜像
curl -i -X DELETE localhost:5000/v2/nginx/manifests/sha256:89a42c3ba15f09a3fbe39856bddacdf9e94cd03df7403cad4fc105088e268fc9
  1. 在Registry容器中执行garbage-collect命令删除未被引用的layer
registry garbage-collect /etc/docker/registry/config.yml
  1. 重启registry容器(不重启的话,会导致刚清理的同名同tag镜像无法push)

使用Python脚本清理镜像(保留每个镜像的最新版本)

import os
import requests


class RegistryHandler(object):
    get_repos_url = '/v2/_catalog'
    get_tags_url = '/v2/{repo}/tags/list'
    get_digests_url = '/v2/{repo}/manifests/{tag}'
    delete_digest_url = '/v2/{repo}/manifests/{digest}'

    def __init__(self, host):
        self.host = host

    def get_repos(self):
        url = f'{self.host}{self.get_repos_url}'
        res = requests.get(url).json()
        return res['repositories']

    def get_tags(self, repo):
        url = f'{self.host}{self.get_tags_url.format(repo=repo)}'
        res = requests.get(url).json()
        return res['tags']

    def get_digest(self, repo, tag):
        headers = {"Accept": "application/vnd.docker.distribution.manifest.v2+json"}
        url = f'{self.host}{self.get_digests_url.format(repo=repo, tag=tag)}'
        resp = requests.get(url, headers=headers)
        return resp.headers['Docker-Content-Digest']

    def delete_digest(self, repo, digest):
        url = f'{self.host}{self.delete_digest_url.format(repo=repo, digest=digest)}'
        requests.delete(url)


if __name__ == '__main__':
    rh = RegistryHandler('http://localhost:5000')
    repos = rh.get_repos()
    for repo in repos:
        tags = rh.get_tags(repo)
        if not tags:
            continue

        delete_tags = sorted(
            filter(lambda tag: '.' in tag, tags),
            key=lambda tag: ''.join([f'{int(n):04d}' for n in tag.split('.')])
        )[:-1]
        for tag in delete_tags:
            try:
                digest = rh.get_digest(repo, tag)
                rh.delete_digest(repo, digest)
            except Exception as e:
                print(f'{repo}:{tag} delete fail: {e}')

    os.system("docker exec `docker ps | grep registry | awk '{print $1}'` registry garbage-collect --delete-untagged /etc/docker/registry/config.yml")
    os.system("docker restart `docker ps | grep registry | awk '{print $1}'`")

配置定期清理

crontab配置如下:

0 0 * * * /usr/bin/python ~/registry_clear.py

参考:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • CentOS7如何修改Docker镜像默认存储位置

    CentOS7如何修改Docker镜像默认存储位置

    这篇文章主要介绍了CentOS7如何修改Docker镜像默认存储位置问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • docker删除none镜像的操作方法

    docker删除none镜像的操作方法

    删除none的镜像,要先删除镜像中的容器,要删除镜像中的容器,必须先停止容器,这篇文章主要介绍了docker删除none镜像的操作方法,需要的朋友可以参考下
    2023-01-01
  • docker下载运行java项目的实现步骤

    docker下载运行java项目的实现步骤

    本文主要介绍了docker下载运行java项目的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • docker运行nginx容器并挂载数据卷

    docker运行nginx容器并挂载数据卷

    本文主要介绍了docker运行nginx容器,并通过挂载目录将容器与宿主机的数据进行共享和统一管理,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • docker部署管理工具portainer-ce的实现

    docker部署管理工具portainer-ce的实现

    Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境,本文主要介绍了docker部署管理工具portainer-ce的实现,感兴趣的可以了解一下
    2023-08-08
  • Docker部署MySQL8集群(一主二从)的实现步骤

    Docker部署MySQL8集群(一主二从)的实现步骤

    本文主要介绍了Docker部署MySQL8集群,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Docker中部署nginx服务的方案

    Docker中部署nginx服务的方案

    这篇文章主要介绍了Docker中部署nginx服务的方案的相关资料,需要的朋友可以参考下
    2022-11-11
  • Docker镜像创建的方法

    Docker镜像创建的方法

    本文给大家汇总介绍了docker中镜像创建的几种方法,包括基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。有需要的小伙伴可以参考下
    2018-08-08
  • Docker单机部署Doris超详细图文教程

    Docker单机部署Doris超详细图文教程

    Apache Doris是一款基于MPP架构的分析型数据库,由百度大数据部研发,支持亚秒级响应时间的实时数据分析,本文旨在为学习Doris的同学提供一个快速的操作指引,以便更高效地挖掘数据背后的价值,对docker 部署Doris 数据库使用感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Docker 镜像、容器、仓库的概念及应用详解

    Docker 镜像、容器、仓库的概念及应用详解

    这篇文章主要介绍了Docker 镜像、容器、仓库的概念及应用详解的相关资料,需要的朋友可以参考下
    2016-12-12

最新评论