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

ASP.NET Core微服务Web应用Docker部署异常,请求技术支援

微服务Docker化部署问题求助

我做了一个案例研究项目,用3个独立项目实现微服务架构,客户端和后端开发完成后本地运行完全正常,但Docker化部署彻底失败,原因不明。

最初遇到错误:

Value Cannot Be Null (Parameter ‘s’)

修改appSettings.json和Dockerfile后这个错误消失,但问题更复杂了——服务器完全不响应,连之前的错误都触发不了。

项目文件夹结构见截图。


其中一个服务的Dockerfile

#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.

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

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["Identity/AdminPanel.Identity.API/AdminPanel.Identity.API.csproj", "Identity/AdminPanel.Identity.API/"]
COPY ["Shared/AdminPanel.Shared/AdminPanel.Shared.csproj", "Shared/AdminPanel.Shared/"]
COPY ["Identity/AdminPanel.Identity.Application/AdminPanel.Identity.Application.csproj", "Identity/AdminPanel.Identity.Application/"]
COPY ["Identity/AdminPanel.Identity.Domain/AdminPanel.Identity.Domain.csproj", "Identity/AdminPanel.Identity.Domain/"]
COPY ["Identity/AdminPanel.Identity.Persistence/AdminPanel.Identity.Persistence.csproj", "Identity/AdminPanel.Identity.Persistence/"]
RUN dotnet restore "./Identity/AdminPanel.Identity.API/AdminPanel.Identity.API.csproj"
COPY . .
WORKDIR "/src/Identity/AdminPanel.Identity.API"
RUN dotnet build "./AdminPanel.Identity.API.csproj" -c $BUILD_CONFIGURATION -o /app/build

FROM build AS publish
RUN dotnet publish "./AdminPanel.Identity.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

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

docker-compose.yml

version: '3.8'

services:
  rabbitmq:
    image: rabbitmq:management
    environment:
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest
    ports:
      - "5672:5672" 
      - "15672:15672" 
    volumes:
      - "rabbitmq_data:/var/lib/rabbitmq"
    networks:
      - adminpanelnet
  identity_api:
    build:
      context: .
      dockerfile: Dockerfile.Identity
    ports:
      - "5218:80"
    container_name: Identity-api
    depends_on:
      - sqlserver_db
    networks:
      - adminpanelnet
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2022-latest
    environment:
      ACCEPT_EULA: "Y"
      SA_PASSWORD: "Password12*"
    ports:
      - "1499:1433"
    networks:
      - adminpanelnet
    container_name: user_db
  command_api:
    build:
      context: .
      dockerfile: Dockerfile.BuildingConfiguration.Command
    ports:
      - "5228:80"
    container_name: Building_Command-api
    depends_on:
      - mongodb
    networks:
      - adminpanelnet
  query_api:
    build:
      context: .
      dockerfile: Dockerfile.BuildingConfiguration.Query
    ports:
      - "5129:80"
    container_name: Building_Query-api
    depends_on:
      - mongodb
    networks:
      - adminpanelnet
  mongodb:
    image: mongo:latest
    ports:
      - "27017:27017"
    container_name: Building_db
    volumes:
      - mongodata:/data/db
    networks:
      - adminpanelnet
volumes:
  mongodata:
  rabbitmq_data:
networks:
  adminpanelnet:
    driver: bridge

appSettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "ConnectionStrings": {
    "UserConnectionString" : "Server=user_db;Database=UserDb;User Id=SA;Password=Password12*;MultipleActiveResultSets=true"
  }
}

launchSettings.json中的容器配置块

"Container (Dockerfile)": {
      "commandName": "Docker",
      "launchBrowser": true,
      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
      "environmentVariables": {
        "ASPNETCORE_URLS": "https://+:443;http://+:80"
      },
      "publishAllPorts": true,
      "useSSL": true
}

排查建议

  • 查看容器启动日志:执行docker logs Identity-api(替换成对应服务的容器名),检查是否有启动失败、数据库连接超时、配置加载错误等隐性问题
  • 修正依赖名称错误:identity_api的depends_on写的是sqlserver_db,但sqlserver服务的容器名是user_db,名称不匹配会导致服务找不到数据库实例,改为depends_on: - sqlserver
  • 调整ASP.NET Core端口配置:容器内仅映射了80端口,但launchSettings里配置了HTTPS端口,建议在docker-compose的各个API服务中添加环境变量,强制使用HTTP:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=http://+:80
    
  • 添加数据库健康检查:depends_on只保证启动顺序,不保证服务就绪,给sqlserver服务添加健康检查,确保数据库就绪后API再启动:
    sqlserver:
      # 原有配置...
      healthcheck:
        test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Password12* -Q 'SELECT 1' || exit 1"]
        interval: 10s
        timeout: 3s
        retries: 10
    
    然后更新identity_api的依赖:
    identity_api:
      # 原有配置...
      depends_on:
        sqlserver:
          condition: service_healthy
    
  • 验证容器网络:执行docker network inspect adminpanelnet,确认所有服务都加入了同一个网络,确保容器间能通过服务名/容器名互相访问
  • 检查Dockerfile构建路径:确认docker-compose的context是项目根目录,各个Dockerfile的路径与实际文件结构匹配,COPY指令能正确复制项目文件

内容的提问来源于stack exchange,提问作者Burak Şenses

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:27:04