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

.Net Core 5使用aspnet:5.0-alpine镜像部署后无法连接Mongo Atlas DB

问题现象

部署在Docker容器内的.NET Core 5 Web API项目无法连接Mongo Atlas DB,本地使用Kestrel运行时可正常连接并查询数据,无任何异常。使用的Docker运行时镜像为aspnet:5.0-alpine,已配置自签名开发证书实现SSL和HTTPS功能,相关配置运行正常,且已将.pfx证书文件拷贝到Docker容器内部。
该问题与MongoDB Atlas要求的TLS/SSL认证流程相关,当前使用的MongoDB.Driver版本为2.13.1,尝试过在连接数据库前加载SSL证书并配置到客户端设置中,依旧连接失败。MongoDB社区论坛及其他线上渠道仅找到问题描述类内容,无可用解决方案。
测试过多版修改后的连接代码均未成功,查询数据无报错,仅返回空数据集。

相关配置

Dockerfile

FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build-env
WORKDIR /app

COPY ["Hammerhead.Common/Hammerhead.Common.csproj", "Hammerhead.Common/"]
COPY ["Hammerhead.Data/Hammerhead.Data.csproj", "Hammerhead.Data/"]
COPY ["Hammerhead.DataProvider/Hammerhead.DataProvider.csproj", "Hammerhead.DataProvider/"]
COPY ["Hammerhead.Services/Hammerhead.Services.csproj", "Hammerhead.Services/"]
COPY ["Hammerhead.App/Hammerhead.App.csproj", "Hammerhead.App/"]

RUN dotnet restore "Hammerhead.App/Hammerhead.App.csproj"

COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine as runtime

# SQL culture fix
RUN apk add icu-libs
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false

#ENV ASPNETCORE_URLS_ http://+:5000;https://+:5001

WORKDIR /app
COPY --from=build-env /app/out .

COPY ./Hammerhead.pfx ./

ENTRYPOINT ["dotnet", "Hammerhead.App.dll"]

docker-compose配置

version: "3"
services:
    rabbitmq:
        image: masstransit/rabbitmq:latest
        ports:
          - "5672:5672"
          - "15672:15672"
    seq:
        image: datalust/seq:latest
        ports:
          - 8081:80
          - 5341:5341
        environment:
          ACCEPT_EULA: "Y"
    trading-app:
        build:
            context: .
            dockerfile: Dockerfile-App
        ports:
            - 5000:80
            - 5001:443
        depends_on:
            - rabbitmq
            - seq
        environment:
            ASPNETCORE_URLS: "https://+;http://+"
            ASPNETCORE_ENVIRONMENT: "Development"
            ASPNETCORE_Kestrel__Certificates__Default__Password: "password"
            ASPNETCORE_Kestrel__Certificates__Default__Path: "./Hammerhead.pfx"
            ASPNET_CORE_HTTPS_PORT: 5001
            Serilog__WriteTo__1__Args__serverURL: "http://seq:5341"
            RABBIT_HOSTNAME: "rabbitmq"

MongoDB.Driver连接代码

string connectionString = "";
MongoClientSettings settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
settings.SslSettings = new SslSettings() { EnabledSslProtocols = SslProtocols.Tls12 };
var mongoClient = new MongoClient(settings);
解决方案
  • 补充安装alpine镜像的CA根证书:alpine基础镜像默认未预装公共CA根证书,无法验证Mongo Atlas服务端TLS证书的合法性,会导致连接静默失败。在Dockerfile的runtime阶段添加如下配置:
# 在现有RUN apk add icu-libs命令后追加安装CA证书的逻辑
RUN apk add --no-cache icu-libs ca-certificates openssl
RUN update-ca-certificates
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
  • 调整MongoDB连接配置:Kestrel使用的自签名证书和Mongo Atlas TLS认证无关,无需将该证书绑定到MongoDB客户端配置,修改连接代码如下:
string connectionString = "";
MongoClientSettings settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
settings.SslSettings = new SslSettings() 
{ 
    EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12,
    CheckCertificateRevocation = false
};
settings.AllowInsecureTls = false;
var mongoClient = new MongoClient(settings);
  • 补全Mongo Atlas连接字符串参数:在连接字符串末尾追加&tls=true&tlsVersion=TLS1_2,强制驱动启用符合Mongo Atlas要求的TLS连接。
  • 验证网络权限:确认Docker容器所在的主机公网IP已经添加到Mongo Atlas的IP访问白名单,可进入运行中的容器执行网络连通性测试,确认可以正常访问Mongo Atlas服务地址。

内容的提问来源于stack exchange,提问作者Victor Altadonna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:15:03