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

带ODBC Driver 17 for SQL Server的.NET Core应用Docker部署故障求助

问题诊断与修复方案

你遇到的卡死问题核心原因是Dockerfile多阶段构建逻辑完全错误:Docker多阶段构建默认以最后一个阶段作为最终镜像,你文件末尾的.NET Framework 4.8阶段没有设置入口点,且前面编译的.NET 5 Core应用完全没有复制到该阶段,容器启动后无目标进程运行,叠加Windows容器高资源占用,直接导致Docker和VS Code无响应。以下是完整修复步骤:


一、修复Dockerfile

优先推荐使用资源占用更低的Linux容器,对应Dockerfile如下:

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env
WORKDIR /app
EXPOSE 80                         
ENV ASPNETCORE_URLS=http://+:80   
COPY *.csproj ./
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o out

# 运行时阶段,内置ODBC驱动
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
# 安装ODBC Driver 17 for SQL Server
RUN apt-get update \
    && apt-get install -y --no-install-recommends gnupg2 curl \
    && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
    && curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update \
    && ACCEPT_EULA=Y apt-get install -y msodbcsql17 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "Info.dll"]

如果必须使用Windows容器,对应Dockerfile如下:

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env
WORKDIR /app
EXPOSE 80                         
ENV ASPNETCORE_URLS=http://+:80   
COPY *.csproj ./
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o out

# 运行时阶段,Windows版本
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
# 安装ODBC驱动
COPY VC_redist.x64.exe c:/temp/
COPY msodbcsql.msi c:/temp/
RUN c:\temp\VC_redist.x64.exe /install /passive /norestart \
    && msiexec.exe /i C:\temp\msodbcsql.msi /norestart /qn IACCEPTMSODBCSQLLICENSETERMS=YES \
    && rd /s /q c:\temp

COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "Info.dll"]

原Dockerfile错误点:

  • 多余的.NET Framework 4.8阶段覆盖了前面的.NET Core构建结果
  • ODBC驱动安装命令拆分,IACCEPTMSODBCSQLLICENSETERMS=YES参数未和msiexec命令同行,不生效

二、修复Docker Compose文件

YAML对缩进要求非常严格,原文件缩进完全错误,修改后版本如下:

version: "3"
services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - "80:80"
    volumes:
      - ./:/app
    environment:
      DATABASE_PARAMS: "Driver={ODBC Driver 17 for SQL Server};server=db\\sql2017;database=info;uid=sa;pwd=你设置的SA密码"
    depends_on:
      - db
  db:
    image: christianacca/mssql-server-windows-express
    ports:
      - "1433:1433"
    environment:
      ACCEPT_EULA: "Y"
      SA_PASSWORD: "你设置的SA密码" # SQL Server容器必填参数,否则启动失败

修正点:

  • 统一缩进为2空格,层级关系正确
  • 数据库连接串服务地址改为db,Compose内部可直接用服务名通信
  • 补充必填的SA密码配置,修正连接串换行错误

三、运行操作步骤

  1. 先终止所有异常容器:执行docker stop $(docker ps -aq),如果Docker无响应直接重启Docker Desktop
  2. 删除原有错误镜像:docker rmi info
  3. 重新构建镜像:docker build -t info . 注意不要遗漏末尾的点
  4. 单独测试镜像运行:docker run -d -p 8080:80 info 加-d参数让容器后台运行,不会占用终端
  5. 用Compose启动整套服务:docker-compose up -d

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:54:06