You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker镜像成功部署至ACR但Web API无法运行排查求助

Azure App Service部署Docker镜像出现应用错误的排查与解决

问题背景

通过GitHub Action将.NET 7 Web API项目构建为Docker镜像并推送到Azure Container Registry(ACR),Workflow运行正常,镜像成功上传。但使用该镜像创建Linux系统的Azure App Service时,始终显示:( Application Error,诊断资源无日志信息;直接从ACR创建App Service也出现相同问题,怀疑镜像存在问题但不知如何排查。

用到的GitHub Action Workflow

name: Build and Deploy Docker Image to Azure Container Registry
on:
  push:
    branches:
      - feature/api-dev
env:
  REGISTRY: registryURL.azurecr.io
  IMAGE_NAME: my_web_api
  AZURE_SERVICE_PRINCIPAL: ${{ secrets.AZURE_SERVICE_PRINCIPAL }}
  AZURE_SERVICE_PRINCIPAL_PASSWORD: ${{ secrets.AZURE_SERVICE_PRINCIPAL_PASSWORD }}
  AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
  AZURE_RESOURCE_GROUP: MY-RESOURCE-GROUP
  AZURE_WEBAPP_PACKAGE_PATH: ./publish
  DOCKERFILE_PATH: ./Project.STT.API/Dockerfile
  
defaults:
  run:
    working-directory: ./Project.STT.API/
    
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
     
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: 7.x
                
      - name: Restore
        run: dotnet restore Project.STT.API.sln
     
      - name: Build
        run: dotnet build Project.STT.API.sln --configuration Release --no-restore
     
      - name: Publish
        run: dotnet publish Project.STT.API.sln --configuration Release --no-build
          --output '${{ env.AZURE_WEBAPP_PACKAGE_PATH }}'
     
      - name: Login to Azure
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Azure Docker Login
        uses: azure/docker-login@v1
        with:
          login-server: ${{ secrets.REGISTRY_LOGIN_SERVER }}
          username: ${{ secrets.REGISTRY_USERNAME }}
          password: ${{ secrets.REGISTRY_PASSWORD }}

      - name: Build Docker image v2
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ${{ env.DOCKERFILE_PATH }}
          push: true
          tags: ${{ secrets.REGISTRY_LOGIN_SERVER }}/registryName:latest
          # outputs: type=registry        
      
      - name: Deploy to Azure Container Instances
        uses: azure/aci-deploy@v1
        with:
          resource-group: ${{ secrets.RESOURCE_GROUP }}
          dns-name-label: ${{ secrets.RESOURCE_GROUP }}${{ github.run_number }}
          image: ${{ secrets.REGISTRY_LOGIN_SERVER }}/registryName:latest
          registry-login-server: ${{ secrets.REGISTRY_LOGIN_SERVER }}
          registry-username: ${{ secrets.REGISTRY_USERNAME }}
          registry-password: ${{ secrets.REGISTRY_PASSWORD }}
          name: aci-webapi
          location: australiaeast
      
      - name: Logout from Azure
        run: docker logout ${{ env.REGISTRY }}

对应的Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
COPY . .
RUN dotnet restore "./Project.STT.API/Project.STT.API.csproj"
RUN dotnet build "./Project.STT.API/Project.STT.API.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "./Project.STT.API/Project.STT.API.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Project.STT.API.dll"]

排查与解决步骤

1. 本地验证镜像可用性

先在本地拉取并运行镜像,确认镜像本身是否正常:

  • 登录ACR:az acr login --name <你的ACR名称>
  • 拉取镜像:docker pull <你的ACR登录服务器>/registryName:latest
  • 本地启动容器:docker run -p 8080:80 <你的ACR登录服务器>/registryName:latest
  • 访问http://localhost:8080测试API响应。如果本地也报错,说明镜像本身存在问题;如果本地正常,再排查App Service配置。

2. 检查Dockerfile与应用端口配置

Azure App Service for Linux默认监听容器的80端口,需确认:

  • 应用程序Program.cs是否正确配置监听80端口:
    var builder = WebApplication.CreateBuilder(args);
    builder.WebHost.ConfigureKestrel(options =>
    {
        options.ListenAnyIP(80);
    });
    
  • 确认Dockerfile中ENTRYPOINT指向的程序集名称正确,可本地发布后查看publish目录下的dll文件名是否为Project.STT.API.dll。

3. 获取App Service容器启动日志

通过以下方式强制获取日志,定位启动失败原因:

  • 登录Azure Portal,进入目标App Service → 左侧菜单「日志」→「容器日志」,查看启动阶段的错误信息(如dll缺失、依赖错误等)。
  • 使用Azure CLI开启日志并查看:
    az webapp log config --name <App Service名称> --resource-group <资源组名称> --web-server-logging filesystem
    az webapp log download --name <App Service名称> --resource-group <资源组名称>
    

4. 清理Workflow冗余步骤

当前Workflow中同时执行了本地dotnet publish和Docker build,而Dockerfile已包含完整的build/publish流程,冗余步骤可能导致上下文混乱:

  • 移除Workflow中的Restore、Build、Publish步骤,让Docker build独立完成编译发布流程。
  • 确认Docker build的context路径正确,避免复制多余文件或缺失必要文件。

5. 检查App Service权限与配置

  • 给App Service的系统分配身份添加ACR的AcrPull角色,确保App Service有权拉取镜像。
  • 确认App Service的启动命令与Dockerfile的ENTRYPOINT一致,无自定义错误命令。

6. 验证镜像内部文件结构

进入运行中的容器,检查文件是否齐全:

  • 启动本地容器后执行:docker exec -it <容器ID> /bin/bash
  • 查看/app目录下是否存在Project.STT.API.dll及所有依赖文件。

内容的提问来源于stack exchange,提问作者Code Ratchet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 05:10:17