推送自定义镜像至Azure ACR失败及GitHub Actions异常求助
问题解决指南
一、原WiFi下ACR推送失败("Use of closed network connection")的修复
可能原因
原WiFi大概率存在以下限制:
- 防火墙/代理拦截了Docker与ACR的HTTPS连接(ACR默认使用443端口)
- WiFi DNS解析异常,无法正确识别ACR注册表域名
- 网络稳定性差,TCP连接中途中断
配置步骤
- 检查防火墙与端口权限
- 确认WiFi允许出站访问443端口
- 企业WiFi环境下,联系管理员将ACR域名加入白名单,或放行Docker相关出站规则
- 配置Docker代理(若WiFi需代理)
- 找到对应系统的Docker配置文件:
- Linux:
~/.docker/config.json - Windows:
C:\Users\<你的用户名>\.docker\config.json - macOS:
~/.docker/config.json
- Linux:
- 添加代理配置(替换为你的代理地址):
{ "proxies": { "default": { "httpProxy": "http://proxy.example.com:8080", "httpsProxy": "http://proxy.example.com:8080", "noProxy": "localhost,127.0.0.1,你的ACR名称.azurecr.io" } } } - 重启Docker服务使配置生效
- 找到对应系统的Docker配置文件:
- 修复DNS解析问题
- 将WiFi DNS服务器改为公共DNS(如8.8.8.8或1.1.1.1),测试ACR域名解析:
nslookup 你的ACR名称.azurecr.io - 确认解析结果正确后,重新尝试推送
- 将WiFi DNS服务器改为公共DNS(如8.8.8.8或1.1.1.1),测试ACR域名解析:
- 重新验证ACR登录状态
- 重新登录ACR确保会话有效:
az acr login --name 你的ACR名称 - 执行推送命令:
docker tag 你的镜像:标签 你的ACR名称.azurecr.io/你的镜像:标签 docker push 你的ACR名称.azurecr.io/你的镜像:标签
- 重新登录ACR确保会话有效:
二、GitHub Actions构建镜像失败(URL/凭据问题)的修复
核心排查点
Actions运行环境独立于本地,需确认:
- ACR登录服务器URL配置完全正确
- GitHub Secrets中存储的凭据有效且权限足够
- Workflow文件中的ACR域名、镜像标签无拼写错误
解决方案
- 确认ACR登录服务器URL
- 在Azure门户ACR概览页复制登录服务器地址(格式:
你的ACR名称.azurecr.io),确保Workflow中完全一致,无多余斜杠或拼写错误
- 在Azure门户ACR概览页复制登录服务器地址(格式:
- 检查GitHub Secrets配置
- 进入GitHub仓库 → Settings → Secrets and variables → Actions
- 确认已添加必要Secrets:
- 若用服务主体登录:
AZURE_CLIENT_ID、AZURE_TENANT_ID、AZURE_SUBSCRIPTION_ID - 若用ACR管理员凭据:
ACR_USERNAME、ACR_PASSWORD(建议优先使用服务主体,权限更可控)
- 若用服务主体登录:
- 修正Workflow文件
- 用Azure/login动作登录的示例:
- name: Azure Login uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: Build and push to ACR uses: azure/acr-build@v1 with: registry: 你的ACR名称.azurecr.io image: 你的镜像:${{ github.sha }} dockerfile: ./Dockerfile context: . - 用Docker直接登录ACR的示例:
- name: Login to ACR uses: docker/login-action@v2 with: registry: 你的ACR名称.azurecr.io username: ${{ secrets.ACR_USERNAME }} password: ${{ secrets.ACR_PASSWORD }} - name: Build and push uses: docker/build-push-action@v4 with: context: . push: true tags: 你的ACR名称.azurecr.io/你的镜像:${{ github.sha }}
- 用Azure/login动作登录的示例:
- 验证服务主体权限
- 若使用服务主体,确保其拥有ACR的
AcrPush角色权限:az role assignment create --assignee <服务主体客户端ID> --scope /subscriptions/<订阅ID>/resourceGroups<资源组名称>/providers/Microsoft.ContainerRegistry/registries/<ACR名称> --role AcrPush
- 若使用服务主体,确保其拥有ACR的
- 测试Workflow
- 手动触发Workflow运行,查看日志中的具体错误,精准定位URL、凭据或权限问题
内容的提问来源于stack exchange,提问作者KASMI G.
相关产品推荐
相关产品推荐

