Docker彻底删除私有库镜像

Docker:上传镜像至仓库时报错 文章目录①故障现象②解决思路 ①故障现象 笔者在练习 Docker 时,上传镜像至 Docker Hub 官网仓库时老是报错,这里贴出报错代码: 情况一: [root@docker ~]# docker push nginx:centos7 The push refers to repository [docker.io/library/nginx] 85fcec7ef3ef: Layer already exists 3e5288f7a70f: Layer already exists 56bc37 阅读详情

首先看看网上一般的做法

私有库默认是不支持删除镜像的,需要修改config.yml配置文件,在storage节点下加入 delete: enabled: true ,然后重启私有库。
在这里插入图片描述
docker 提供的镜像删除api为:

DELETE ip:端口/v2/<repository>/manifests/<reference>

repository 为镜像的repository
reference 为镜像push成功后生成的 digest:sha256 值

获取 digest :

curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET  <私有库ip>:端口号/v2/<镜像repository>/manifests/<镜像tag>

注意:
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" 这个header 是必须要加的,不加的话Content-Type 是v1+prettyjws,获取的digest是错误的!!

   例:curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET 192.168.120.107:5000/v2/my-registry/manifests/1.0

在这里插入图片描述
删除镜像:

例:curl -I -X DELETE http://192.168.120.107:5000/v2/my-repository/manifests/sha256:4d523adb3c653bab7dfd0326081860b3cba24dc393f69d6731daa513c435ec0c

删除后我们查看下私有库

curl 192.168.120.107:5000/ v2/my-repository/tags/list

就会发现刚删除的那个tag不见了。但是如果在执行命令的前后车库内私有库镜像存储目录的文件大小,会发现并没有多大的变化
显然数据并没有被真的删除,我们还需要运行docker提供的垃圾回收命令。

垃圾回收

我们需要登录 私有库所在的服务器,然后执行命令:

docker exec -it <私有库的容器ID或者容器名> sh -c ' registry garbage-collect /etc/docker/registry/config.yml'

当然,也可以进入到私有库的容器中,再执行:

docker exec -it <私有库的容器ID或者容器名> sh

registry garbage-collect /etc/docker/registry/config.yml

这种方法特别麻烦,只能删tag,不会删repository,删除之后会在blobs目录下留下很多空文件夹,而且如果一个repository下有多个tag,而这些tag的数据相同的话,删除其中一个tag会同时把所有tag都删了

虽然网上有删除私有库镜像的python脚本,但是我感觉并不好用。
我是不会满足于此的,于是我自己写了个sh脚本,先来看看效果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
脚本还有一些人性化的提示,而且sh脚本通俗易懂,容易扩展,脚本我也上传到gitHub上了,有兴趣的可以下载试试。
gitHub地址:https://github.com/hushuai86/docker-delete

下载运行:

#先下载脚本到/usr/local/bin/目录下
curl https://raw.githubusercontent.com/hushuai86/docker-delete/master/docker-delete-2.0.sh | sudo tee /usr/local/bin/docker-delete >/dev/null

#赋予可执行权限
chmod a+x /usr/local/bin/docker-delete

#私有库镜像存储目录路径全局环境变量(该路径就是运行私有库容器时,用-v 命令将私有库容器内 /var/lib/registry目录挂载到本机的路径)
#例: /opt/data/registry是我运行容器时私有库镜像存储目录挂载到本地的目录
echo "export DOCKER_REGISTRY_DIR=/opt/data/registry" >>/etc/profile

#运行私有库容器ID全局环境变量设置(正在运行的私有库容器的 ID)
#例: 89b9b3c9054ay是我的私有库库容器的id
echo "export DOCKER_REGISTRY_CONTAINER_ID=89b9b3c9054a" >>/etc/profile

#使配置生效
source /etc/profile

然后就可以使用docker-delete命令了,如果你觉得脚本有哪些用着不舒服的地方,可以编辑脚本自己改改

原理解析:
(在以下的截图中 /opt/data/registry是我运行容器时私有库镜像存储目录挂载到本地的目录)
私有库镜像存储目录下有两个文件夹 blobs和 repositories
在这里插入图片描述
其中repositories目录下是以镜像repository命名的几个文件
也就是说想要知道私有库有哪些镜像,直接看这个文件夹有哪些子文件夹就知道了
而在每个镜像repository文件夹/_manifests/tags目录下可以 看到该镜像有哪些tag
在这里插入图片描述
但是镜像的真实数据并不在repositories目录下,而是以数据块的方式存储在blobs目录下,一个镜像被分成多个数据块,也就是执行垃圾回收命令时输出的 ‘marking blob …‘那样的关联关系,而镜像和数据块之间的关联关系就是在 repositories/镜像repository/_manifests/revisions/sha256/ 目录下的sha256值。
在这里插入图片描述
在以sha256值命名的目录下有个link的文件,内容就是这个sha256值

经过我测试发现,只要这个link文件被删除,然后在私有库容器内执行垃圾回收命令‘ registry garbage-collect /etc/docker/registry/config.yml’,那么这个sha256值关联的blobs就会被彻底删除

但是,一个镜像可能有很多个tag,那么这个sha256值关联的 blobs数据 到底属于哪个 tag呢?
我们进到镜像的某个tag/index/sha256/ 目录,会发现 有个 sha256值命名的文件夹,而且这个sha256值 在之前的revisions/sha256/ 下存在。在这个文件夹下也有个link文件,保存了该sha256值。
在这里插入图片描述
所以根据我的理解,当我们调用docker提供的API 删除一个tag时,会在这个镜像的tag/index/sha256/<sha256值>/link文件中获取sha256值,然后看是不是还有其他tag也关联了这个sha256值,如果有的话,只删除这个tag文件夹,如果没有的话,那么在删除这个tag的文件的同时还会删掉 revisions/sha256/ 目录下的 改sha256对应的link文件,这样的话,当在容器内执行垃圾回收的命令时,就会彻底删除该sha256值关联的blobs数据。

特别注意: 在彻底删除一个镜像的数据后,需要重启下私有库容器,如果不重启的话,你再push该镜像到私有库时,总是会输出 Layer already exists ,似乎是push上去了,但是如果你删除本地的该镜像,然后再pull ,就会报错。当然,我写的脚本里是有这个步骤的

Docker 私有仓库搭建,私有库镜像的推送 、拉取和删除 一.搭建私有库 docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry -v /data/config.yml:/etc/docker/registry/config.yml –name myregistry registry 第一个-v 是挂载的私有镜像存放的目录,挂载到本机后即使容器被删除,私有库中的镜像不会丢失... 阅读详情

相关推荐

Docker本地镜像发布到私有库

本地镜像发布到私有库1、私有库是什么?2、将本地镜像推送到私有库实践2.1 下载镜像Docker Registry2.2 运行私有库2.3 制作一个新镜像2.4 curl验证私服库上有什么镜像2.5 将新镜像xttubuntu:1.2修改符合私服规范的Tag2.6 修改配置文件使docker支持http2.7 push推送到私服库2.8 curl验证私服库上是否有推送的镜像2.9 将私有库的镜像拉取到本地并运行 1、私有库是什么?   通常我们是将自己的镜像发布到Docker Hub:https://hub

冲出仁川,走出马德里,故事还会再继续 2061

Docker报错(Error): Layer already exists如何处理

作者:变优秀的小白 Github:关注YX-XiaoBai 爱好:Americano More Ice ! QQ学习交流群(new): 811792998 Error: Layer already exists 当你修改了源码,准备docker push上repo时,来个Layer already exists,你发现本地运行web是已经使用了最新源码但是别人远程访问依然是旧的。 原因: 因为你部署在docker hub上的源码并没有更新成功 解决 暴力解决即可,话不多说,实战为主 // 强制移除镜像 $

变优秀的小白的博客 2万+

Docker Registry 私有仓库镜像的查看与删除操作

在本文中,我们将介绍如何使用 Docker Registry 客户端工具来查看和删除私有仓库中的镜像。要查看私有仓库中的镜像,我们需要使用 Docker Registry 客户端工具。在本例中,我们将使用 Docker 命令行工具来演示如何查看私有仓库中的镜像。本文介绍了如何使用 Docker Registry 客户端工具来查看和删除私有仓库中的镜像。要删除私有仓库中的镜像,我们也需要使用 Docker Registry 客户端工具。命令来列出私有仓库中的所有镜像,使用。这将删除私有仓库中的所有镜像。

TiCrystal的博客 1919

docker registry提示Layer already exists但blob数据不存在

docker registry的GC行为导致了数据的不一致

nangonghen的博客 6190

Docker私有仓库管理和删除本地仓库中的镜像

主要介绍了Docker私有仓库管理和删除本地仓库中的镜像,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

嵌入式学习笔记——EEPROM(M24M01)

M24M01是ST公司出品的1Mbit(128Kbyte)I2C兼容EEPROM,兼容所有I2C总线模式(1MHz、400kHz、100kHz),Page大小为256字节,支持硬件写保护,超过400万次写入操作,超过200年的数据留存通过模块化设计,涵盖了 M24M01-RMN6P 的功能介绍、引脚架构、硬件连线、模块化代码以及性能优化思路,我们将 M24M01 EEPROM 与 STM32 的集成变得高效而可靠。希望能帮你在 STM32 上快速上手,并让你的项目存储管理更高效可靠。

2301_80488241的博客 1657

Docker之Harbor私有库彻底删除镜像

Docker之Harbor私有库彻底删除镜像

优快云技术支持 2513

AI算力瓶颈与系统优化实战指南

AI算力瓶颈已成为制约人工智能发展的关键因素,特别是在处理transformer类模型时,传统的冯·诺依曼架构面临严重的'内存墙'问题。通过硬件加速、系统优化和算法改进的三级策略,可以有效提升资源利用率。在嵌入式AI领域,结合量化、剪枝和专用指令集扩展等技术,能在资源受限设备上实现高效推理。这些优化方法在自动驾驶、工业视觉等场景中已展现出显著价值,推动AI应用从云端向边缘迁移。随着AI算力需求的持续增长,掌握系统优化技能将成为开发者的核心竞争力。

weixin_32597009的博客 340

Docker rmi 命令详解:彻底掌握Docker镜像删除技巧

摘要:《Docker rmi命令详解》全面讲解了Docker镜像删除的核心命令。文章从基础语法和参数说明入手,详细介绍了删除单个/多个镜像、强制删除等使用场景。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

强化学习经典算法笔记(九):LSTM加持的PolicyGradient算法

强化学习经典算法笔记(九):LSTM加持的PolicyGradient算法 在上文《强化学习经典算法笔记(八):LSTM加持的A2C算法解决POMDP问题》的基础上,实现了LSTM+MLP的Policy Gradient算法。 实现过程如下: import argparse, math, os, sys import numpy as np import gym from gym import wrappers import matplotlib.pyplot as plt import torch fr

hhy_csdn的博客 5636

tesseract-ocr的字库学习步骤(训练自己的文库),关于ocr的对图片的解析,包括tesseract的安装(史上最全)

tesseract-ocr的字库学习步骤(训练自己的文库) 简介:在网上看了很多案列。都不是很完整。然后自己用了一天时间进行整理,第一次写文章,希望对大家有帮助。 一、安装tesseract 下载地址https://github.com/UB-Mannheim/tesseract/wiki 1.点击下面下载的这个进行运行(安装的时候有点慢) 2.点击next 3.I accept the terms of the License Agreement前的复选框打勾,点击Next。 4.Install f

HAC12的博客 2229

Docker 如何删除及清理镜像

一、通过标签删除镜像 通过如下两个都可以删除镜像: docker rmi [image] 或者: docker image rm [image] 支持的子命令如下: -f, -force: 强制删除镜像,即便有容器引用该镜像; -no-prune: 不要删除未带标签的父镜像; 例如,我们想删除上章节创建的allen_mysql:5.7镜像,命令如下: docker rmi allen_mysql:5.7 从上面章节中,我们知道allen_mysql:5.7和d...

诚的博客 11万+

【中英双语】Illumina测序原理详解 | 边合成边测序/Sequencing by Synthesis

很多朋友们问我视频讲解时用的笔记可不可以分享,那当然必须是可以呐!但我当时其实没有好好记录,只是打了个草稿就开讲啦!既然大家有需求,俺就重新整理了一下,希望可以帮到大家!

weixin_43843918的博客 7872

Docker镜像发布到阿里云和私有库

将Docker镜像发布到阿里云及本地私有库

m0_62946761的博客 1万+

王爽《汇编语言》课程设计2(不涉及软盘版本)

assume cs:code,ds:data,ss:stack stack segment db 128 dup (0) stack ends data segment db 256 dup (0) data ends code segment start: mov ax,stack mov ss,ax mov sp,128 ...

weixin_41944412的博客 1178

<IBM AIX> 《HACMP 实用手册和命令 HA切换手册》 - 鸿篇巨制,全网最全

操作命令检查磁盘预留策略要将磁盘预留策略更改为 no_reserve集群状态实用程序查看集群状态是否正常SMIT System Management (C-SPOC)Cluster ServicesShow Cluster Services 面板上的选项或 lssrc 命令查看资源组、资源组对应的VG、资源组对应的APPLICATION SERVER# ./cldispsmit常用命令F3退出F4列表Esc+6或者F6查看命令Esc+7或者F7选择多项检查状态。

Else 的博客 3363

【Docker系列】docker删除镜像

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 2万+

uniapp ios原生插件开发 (framework,cocoapods)

已知UniApp的插件开发方式有两种, 第一种 Xcode Framework的方式,这种方式是官方指定的方式。 这种方式的优点就是简单直接, 但也有不足,比如当插件需要引入一些三方库时,操作起来就不是那么方便。 而使用Cocoapods则可以很方便的引入三方库。 接下来,本文探索使用Cocoapods的方式来进行UniApp插件开发。

Rey的技术博客 9823

【Docker】将本地镜像推送到远程库/私有库

将本地镜像推送到阿里云和私有库的方法。区别,一个是存放到阿里云,同一个团队可以登录到同一个阿里云仓库,去拉取镜像。一个是存放到本地私有库,同一个团队可以连接同一个私有库,去拉取镜像。例如,有重要机密东西不想放到阿里云仍然可以进行协调工作。

weixin_55519875的博客 5173

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Docker | 创建私有库并了解将项目放入和拉取到私有库的流程

curl是一个功能强大的命令行工具,用于传输数据,支持多种协议,包括 HTTP、HTTPS、FTP、SCP、SFTP 等。它常用于从命令行发送请求到服务器,下载文件,测试网络服务等。以下是curl发送 HTTP GET 请求这会向发送一个 GET 请求,并显示响应内容。发送 HTTPS GET 请求这会向发送一个 GET 请求,并显示响应内容。下载文件使用-O参数,curl会将下载的文件保存为 URL 中指定的文件名。发送 HTTP POST 请求使用-d参数发送 POST 请求,并传递数据。

HG0724的博客 1601

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

docker学习之如何删除docker中的镜像

目录 查找需要删除的镜像 直接删除 查询所有docker容器 停掉所需要删除镜像的容器 删除镜像 镜像成功删除 注意事项: 在安装调试完毕docker之后,想要删除一些已经下载的镜像。发现怎么都删除不掉,看来删除docker的镜像,没有我们想想中的那么简单。 查找需要删除的镜像 sudo docker images 如果我们要删除hello-world这个镜像,可以看到他的IMAGE ID为bf756fb1ae65 。 直接删除 如果我们直接用dock...

Tian Jincheng's Blog 3万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

怎么彻底删除docker的tomcat镜像

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、遇到问题的场景(彻底删除一个正在运行的镜像)1、启动tomcat镜像2、列出所有在运行的容器信息二、彻底删除一个正在运行的容器(重点)1.查看tomcat的镜像id2、列出所有在运行的容器信息3、如果tomcat容器正在运行先停止,可以通过容器id或者容器名称4、再次查看容器运行情况,可以看到没有运行中的容器了.5、查看所有容器(-a表示查看所有)无论是正在运行的还是未运行的6、删除未运行的容器7、再次查看所有容器已被删除.

qq_37133255的博客 3329

docker构建本地镜像、将镜像发布到阿里云以及私有库

1、构建本地镜像 1、执行docker pull ubuntu命令从远程仓库拉取一个镜像,这里以ubuntu为例 2、执行docker run -it ubuntu /bin/bash命令运行刚拉取的ubuntu镜像 从远程仓库中拉取的ubuntu是没有vim文本编辑器 接下来我们安装vim编辑器 执行apt-get update, apt-get -y install vim完成安装 安装完成后,可以看到vim编辑器已经可以使用了。这里再a.txt里添加了there is dockers insta

m0_49405757的博客 1851

Docker本地镜像推送到私有库

Docker Registry是官方提供的工具,可以用于构建私有镜像仓库 1. 下载镜像Docker Registry docker pull registy 2. 运行私有库Registry,相当于本地有个私有Docker hub docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry 默认情况,仓库被创建在容器的/var/lib/registry...

枫陵的博客 9972

Docker - 11. 本地镜像发布到私有库

如果涉及到公司机密文件,使用DockerHub、阿里云这样的公共镜像仓库就不合适,所以需要创建一个本地私人仓库提供给团队使用,基于公司内部项目构建镜像。默认情况下仓库被创建在容器的/var/lib/registry目录下,建议用容器卷映射,方便于宿主机联调。11. 通过新镜像进入容器,看是否能够使用 ifconfig 命令,如果显示如下命令,则往私服库推送和拉取镜像成功。9. 将新镜像使用push命令推送到私服库,并使用curl命令验证私服库镜像。10. 删除本地新镜像,并从私服库拉取镜像。

Aaron_neil的博客 1014
上一篇: Jenkinsfile +docekr 自动化构建镜像并push到私有库
下一篇: Git revert 某次 merge 之后再重新 merge 代码被冲掉
Fickle_actor
博客等级 码龄9年 23粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值