带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密码配置,修正连接串换行错误
三、运行操作步骤
- 先终止所有异常容器:执行
docker stop $(docker ps -aq),如果Docker无响应直接重启Docker Desktop - 删除原有错误镜像:
docker rmi info - 重新构建镜像:
docker build -t info .注意不要遗漏末尾的点 - 单独测试镜像运行:
docker run -d -p 8080:80 info加-d参数让容器后台运行,不会占用终端 - 用Compose启动整套服务:
docker-compose up -d
内容的提问来源于stack exchange,提问作者Aneesh
相关产品推荐
相关产品推荐

