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再启动:
然后更新identity_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: 10identity_api: # 原有配置... depends_on: sqlserver: condition: service_healthy - 验证容器网络:执行
docker network inspect adminpanelnet,确认所有服务都加入了同一个网络,确保容器间能通过服务名/容器名互相访问 - 检查Dockerfile构建路径:确认docker-compose的context是项目根目录,各个Dockerfile的路径与实际文件结构匹配,COPY指令能正确复制项目文件
内容的提问来源于stack exchange,提问作者Burak Şenses
相关产品推荐
相关产品推荐

