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
相关产品推荐
相关产品推荐

