VS Code中docker login登录epregistry.azurecr.io报403如何解决
问题成因
这个报错不是密码输入错误导致的(密码错误会返回明确的401鉴权失败提示,不会出现空响应体的JSON解析错误),核心原因是请求到ACR(Azure容器注册表)v2接口的链路被拦截,返回了无内容的403响应,Docker无法按预期解析JSON格式的错误信息,触发该报错,常见触发场景如下:
- 本地网络代理、VPN、防火墙规则拦截了对
epregistry.azurecr.io的请求,拦截层直接返回空403响应,没有走到Azure ACR的服务端 - ACR实例配置了公网访问限制:比如开启了专用端点、公网访问被禁用、IP白名单未包含当前环境的出口IP,公网请求被Azure边缘层直接拦截,返回空403
- 本地Docker客户端的代理配置错误,请求被无效代理拦截返回空响应
排查解决步骤
按以下顺序逐一验证,定位问题后修复即可:
- 先验证链路连通性
在终端执行命令:
curl -v https://epregistry.azurecr.io/v2/
观察返回的响应头:
- 如果响应里没有
x-ms-request-id这类Azure服务专属的响应头,直接返回空403,说明是本地网络/代理/VPN拦截,关闭代理、切换网络(比如手机热点)后重新尝试登录即可 - 如果响应包含Azure服务标识,提示客户端IP不在允许访问范围内,登录Azure门户找到对应ACR实例,进入「网络」配置页,将当前环境的公网出口IP加入访问白名单,或临时开启公网访问测试连通性
- 校验ACR基础配置
- 确认登录地址
epregistry.azurecr.io拼写正确,无多余或缺失字符 - 进入ACR实例的「访问密钥」页,确认管理员用户开关为开启状态,登录用户名为注册表名
epregistry,密码为该页面生成的主密钥/辅助密钥,不要使用Azure全局账号的密码登录 - 如果ACR仅配置了专用端点访问,确认当前操作环境已经通过VPN、VNet对等方式接入到ACR所在的虚拟网络,否则公网环境无法正常连接
- 校验本地Docker配置
打开Docker Desktop设置页,进入「Resources - Proxies」配置项,确认代理配置正确,无错误的拦截规则,可临时关闭代理配置后重试登录;也可执行docker info命令查看输出末尾的代理配置项,确认系统环境变量里没有残留的无效代理配置。
验证标准:当执行curl访问v2接口能正常返回401 Unauthorized提示(要求输入鉴权信息)时,说明链路已经连通,此时再执行
docker login epregistry.azurecr.io输入正确的用户名密码即可正常登录,不会再出现JSON解析错误。
内容的提问来源于stack exchange,提问作者Eliot Kim
相关产品推荐
相关产品推荐

