Azure App Service部署成功后API更新延迟7-9小时问题咨询
问题根因
7-9小时的延迟刚好匹配Azure App Service容器实例的默认固定标签镜像轮询周期:如果你给App Service配置的镜像地址用的是latest这类固定标签,App Service不会在收到部署请求时立刻拉取新镜像,只会按默认8小时左右的固定周期检查镜像仓库对应标签是否有更新,确认有更新才会拉取重启。这就是为什么GitHub Actions显示执行成功,站点却要等半天才更新。
你当前的配置有两个点直接导致这个问题:
- 构建推送镜像时一直复用
v1、latest两个固定标签,没有给每次构建生成唯一可识别的标签 - 部署步骤传给Azure的镜像地址没有任何版本标识,和App Service上已经配置的镜像地址完全一致,部署动作不会触发强制拉取和容器重启
另外你贴的工作流文件存在YAML缩进错误,pull_request触发规则、job和step层级都有缩进丢失问题,容易导致PR提交时意外触发生产部署,需要一并修正。
修复步骤
1. 给每次构建的镜像打唯一标签
把当前提交的Git SHA作为镜像的唯一标签,和固定标签一起推送到Docker Hub,让每次构建的镜像都有唯一可识别的标识:
- name: Docker build and push uses: mr-smithers-excellent/docker-build-push@v5 with: image: donephit/city-discover-tourist-server tags: v1, latest, ${{ github.sha }} registry: docker.io username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }}
2. 部署时明确指定带唯一标签的镜像地址
修改部署步骤的镜像参数,明确传入本次构建对应的带Git SHA标签的镜像地址,强制App Service识别到镜像变更,立刻触发拉取和重启:
- name: Deploy to Azure Web App id: deploy-to-webapp uses: azure/webapps-deploy@v2 with: app-name: 'CityTourist' slot-name: 'production' publish-profile: ${{ secrets.AzureAppService_PublishProfile_b411f9150dc04ec7a5df33a041e87f5f }} images: donephit/city-discover-tourist-server:${{ github.sha }}
3. 修正工作流YAML缩进问题
把触发配置、job和step的缩进调整为标准YAML格式,避免意外触发:
on: push: branches: - main pull_request: branches: [main] workflow_dispatch: jobs: build: runs-on: 'ubuntu-latest' steps: - uses: actions/checkout@v2 # 后续构建步骤保持2个空格的缩进层级 deploy: runs-on: ubuntu-latest needs: build environment: name: 'production' url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} steps: # 部署步骤保持正确缩进
4. (可选优化)开启Azure端持续部署
到Azure Portal对应App Service的「配置」-「容器设置」页,打开「持续部署」开关,后续Docker Hub上的镜像更新会主动触发App Service拉取,进一步降低部署延迟。也可以添加应用设置DOCKER_ENABLE_CI = true强化CI触发逻辑。
验证方式
修改完配置提交代码到main分支,等GitHub Actions执行完成后,到App Service的「部署中心」-「部署日志」里可以看到即时触发的镜像拉取、容器重启记录,一般1-5分钟内新版本就会生效,不会再出现数小时的延迟。
内容的提问来源于stack exchange,提问作者Dat
相关产品推荐
相关产品推荐

