如何开启Docker私有Registry删除功能?Registry版本2.7.1
解决Docker Registry 2.7.1删除镜像失败的问题
1. 正确配置删除功能(避免容器重启后配置丢失)
你之前通过环境变量配置无效,是因为Registry的环境变量需要匹配配置层级的传递规则,手动修改容器内配置会在重启后被镜像默认文件覆盖,正确做法如下:
方式一:通过docker-compose环境变量配置
在docker-compose.yml中按层级结构设置环境变量:
version: '3' services: registry: image: registry:2.7.1 environment: - REGISTRY_STORAGE_DELETE_ENABLED=true volumes: - ./registry-data:/var/lib/registry ports: - 5000:5000
方式二:挂载自定义配置文件
创建本地config.yml文件,写入完整配置:
version: 0.1 storage: delete: enabled: true filesystem: rootdirectory: /var/lib/registry http: addr: :5000
然后在docker-compose.yml中挂载该文件:
version: '3' services: registry: image: registry:2.7.1 volumes: - ./registry-data:/var/lib/registry - ./config.yml:/etc/docker/registry/config.yml ports: - 5000:5000
修改后重启容器,配置会持久生效。
2. 确认存储驱动支持删除
Registry 2.7.1默认的filesystem存储驱动支持删除操作,若你使用了S3、Azure Blob等第三方存储后端,需确认该后端是否开启了删除权限。
如果是filesystem驱动,检查挂载的本地目录权限:容器内运行用户ID为10000,本地目录需给该用户读写权限:
chown -R 10000:10000 ./registry-data
3. 正确执行删除与垃圾回收
删除镜像需要分两步操作:
步骤1:删除镜像Manifest
首先获取镜像Manifest的哈希值(不能直接用tag):
curl -I http://你的Registry地址:5000/v2/镜像名/manifests/镜像tag
在响应头中找到Docker-Content-Digest字段,这就是需传入的哈希值,执行删除:
curl -X DELETE http://你的Registry地址:5000/v2/镜像名/manifests/哈希值
步骤2:执行垃圾回收清理冗余数据
删除Manifest后,镜像层文件仍会留在存储目录,需运行垃圾回收彻底清理:
docker exec -it Registry容器名 registry garbage-collect /etc/docker/registry/config.yml
添加--delete-untagged参数可同时清理所有无tag的镜像:
docker exec -it Registry容器名 registry garbage-collect /etc/docker/registry/config.yml --delete-untagged
4. 排查配置生效情况
若仍返回UNSUPPORTED错误,检查容器启动日志确认配置加载:
docker logs Registry容器名
日志中应出现storage.delete.enabled: true的配置项,若未出现,说明配置未正确加载,需检查挂载或环境变量的写法。
内容的提问来源于stack exchange,提问作者Kaue Almeida
相关产品推荐
相关产品推荐

