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

参考:

总结

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

相关文章

  • docker创建并运行一个MySql容器,并将宿主机直接挂载到容器

    docker创建并运行一个MySql容器,并将宿主机直接挂载到容器

    这篇文章主要介绍了docker创建并运行一个MySql容器,并将宿主机直接挂载到容器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • docker如何创建nginx图片服务器

    docker如何创建nginx图片服务器

    这篇文章主要介绍了docker如何创建nginx图片服务器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Docker搭建Harbor公开仓库的方法示例

    Docker搭建Harbor公开仓库的方法示例

    这篇文章主要介绍了Docker搭建Harbor公开仓库的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Docker构建简单的个人主页网站实战教程

    Docker构建简单的个人主页网站实战教程

    Docker是一种开源容器化技术,可以打包、发布和运行应用程序,本教程介绍了如何使用Docker构建一个简单的个人主页网站,通过编写Dockerfile来自定义镜像,并展示了如何通过传入环境变量来动态更改网页内容,项目使用的技术包括Docker、Alpine、Nginx、HTML、CSS和JavaScript
    2024-10-10
  • Docker 下MySQL数据库的备份和恢复的操作方法

    Docker 下MySQL数据库的备份和恢复的操作方法

    这篇文章主要介绍了Docker 下MySQL数据库的备份和恢复操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Docker镜像pull失败两种解决办法小结

    Docker镜像pull失败两种解决办法小结

    有时候我们在拉取Docker镜像的过程中会遇到一些问题,这篇文章主要介绍了Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • 通过UI管理docker的方法

    通过UI管理docker的方法

    这篇文章主要介绍了通过UI管理docker的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Docker+Jenkins实现一键自动化部署项目的图文教学

    Docker+Jenkins实现一键自动化部署项目的图文教学

    Jenkins是一个广泛使用的开源持续集成工具,它能自动化构建,测试和部署软件项目,本文主要介绍了关于docker搭建Jenkins实现一键自动化部署项目,需要的朋友可以参考下
    2025-05-05
  • docker安装git教程,解决clone地址端口错误的问题

    docker安装git教程,解决clone地址端口错误的问题

    这篇文章主要介绍了docker安装git教程,解决clone地址端口错误的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • MongoDB从入门到实战之Docker快速安装MongoDB的详细过程

    MongoDB从入门到实战之Docker快速安装MongoDB的详细过程

    这篇文章主要介绍了MongoDB从入门到实战之Docker快速安装MongoDB的详细过程,本文给大家分享详细实战教程,帮助大家快速把MongoDB环境搭建起来,感兴趣的朋友一起看看吧
    2025-05-05

最新评论