Docker私有仓库删除镜像时报insufficient_scope 401错误
问题原因及解决方案
- 确认私有Docker Registry服务端已开启删除权限
Docker Registry默认禁用manifest删除操作,需在Registry服务的配置中显式开启:
若通过环境变量启动Registry,添加参数:REGISTRY_STORAGE_DELETE_ENABLED=true
若通过config.yml配置,添加如下配置段:
配置完成后重启Registry服务生效。storage: delete: enabled: true - 修正获取Token时的scope参数错误
你当前获取Token的请求中scope参数多了一个多余的斜杠:repository:my-repo/:*,正确的仓库scope格式为repository:<仓库名>:<权限>,仓库名末尾不需要额外斜杠,修改为:TOKEN=`curl -s \ -H "Content-Type: application/json" --user myuser:mypassword \ "http://mydockerregistry.com:8080/api/auth?service=mydockerregistry.com&scope=repository:my-repo:*" \ | jq -r .token` - 确认认证账号拥有仓库删除权限
多数Registry认证后端的pull,push权限不包含删除操作,你需要确认:- myuser账号在认证系统中已被分配my-repo仓库的删除权限
- 若认证系统不支持
*通配符权限,可将scope显式指定为repository:my-repo:pull,push,delete
- 校验DIGEST变量的正确性
你当前获取DIGEST的逻辑可能会带回车、换行等不可见字符,导致后续删除请求识别错误,可添加字符清洗逻辑:
执行完成后可先执行DIGEST=`curl -vk \ -H "Authorization:Bearer $TOKEN" \ -H "Accept:application/vnd.docker.distribution.manifest.v2+json" \ https://mydockerregistry.com/v2/my-repo/manifests/latest 2>&1 \ | grep "< Docker-Content-Digest:" | awk '{print $3}' | tr -d '\r\n'`echo $DIGEST确认输出为标准的sha256摘要格式,无多余字符。 - 额外校验逻辑
可先执行curl -H "Authorization:Bearer $TOKEN" https://mydockerregistry.com/v2/my-repo/tags/list确认Token能正常访问仓库接口,排除Token本身解析错误、过期等问题。
内容的提问来源于stack exchange,提问作者Lucas Ricardo Grana
相关产品推荐
相关产品推荐

