从GCE推送镜像至Artifact Registry遇认证失败问题求助
问题:GCE推送Docker镜像至Artifact Registry(路由模式)时认证失败
我正尝试从Google Cloud Compute Engine(GCE)将Docker镜像推送至Artifact Registry,当前使用gcr.io主机名,且已将Container Registry设置为“路由至Artifact Registry”。在GCE内构建镜像后执行推送命令:
docker push gcr.io/$PROJECT_ID/$NAME:3.2.0
遇到错误:
unauthorized: authentication failed
已完成的排查步骤:
- 通过
gcloud config set account设置了服务账号 - 执行
gcloud auth application-default login完成登录 - 运行
gcloud auth configure-docker gcr.io,生成的config.json内容如下:
{ "auths": {}, "credHelpers": { "asia.gcr.io": "gcr", "eu.gcr.io": "gcr", "gcr.io": "gcloud", "marketplace.gcr.io": "gcr", "us.gcr.io": "gcr" } }
- Artifact Registry页面显示GCE服务账号拥有Artifact Registry Administrator角色
- 可以正常拉取镜像,但无法推送
解决方法
1. 确认GCE实例关联的服务账号权限
你手动设置的服务账号不一定是GCE实例实际使用的账号——实例默认采用自身关联的服务账号。请:
- 进入GCE实例详情页,查看「服务账号」字段,确认该账号已被授予
roles/artifactregistry.writer或更高权限(如你提到的Administrator) - 若实例使用默认服务账号,需为该账号补充Artifact Registry的推送权限
2. 刷新身份凭证
GCE通过元数据服务器获取凭证,可能存在缓存过期问题,执行以下命令重置:
# 清除旧的默认应用凭证 gcloud auth application-default revoke # 重新获取实例关联服务账号的凭证 gcloud auth application-default login --no-launch-browser # 或直接激活实例绑定的服务账号(若有密钥文件) gcloud auth activate-service-account --key-file=/path/to/your-service-account-key.json
3. 验证Docker登录有效性
直接通过gcloud令牌验证Docker是否能正常认证:
gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin gcr.io
若登录成功,再重试推送命令。
4. 匹配仓库位置与路由规则
启用路由模式后,gcr.io仅对应多区域Artifact Registry仓库(如us、eu、asia)。若你的仓库是单区域(如us-central1),需使用对应区域域名(如us-central1.gcr.io)进行推送。
5. 检查网络连通性
确保GCE实例可访问Artifact Registry的HTTPS端点:
# 测试443端口连通性 telnet gcr.io 443 # 或检查HTTPS响应 curl -I https://gcr.io/v2/
若连接失败,排查实例的防火墙规则是否允许出站HTTPS流量。
内容的提问来源于stack exchange,提问作者Cheng Shi
相关产品推荐
相关产品推荐

