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

同一Docker容器运行.NET Core应用与SQL Server的Dockerfile及初始化方法

SQL Server + .NET Core 单容器部署方案

1. 编写Dockerfile

我们选择以微软官方SQL Server 2019 Linux开发者版镜像为基础,叠加安装.NET 5运行环境,避免基础依赖冲突:

# 基础镜像:SQL Server 2019 开发者版
FROM mcr.microsoft.com/mssql/server:2019-latest
# 切换到root权限安装依赖
USER root

# 安装系统依赖、.NET 5运行时、SQL Server命令行工具
RUN apt-get update \
    && apt-get install -y wget apt-transport-https software-properties-common \
    && wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \
    && dpkg -i packages-microsoft-prod.deb \
    && apt-get update \
    && apt-get install -y aspnetcore-runtime-5.0 mssql-tools unixodbc-dev \
    && rm -rf /var/lib/apt/lists/*

# 配置环境变量
ENV PATH="$PATH:/opt/mssql-tools/bin"
ENV ASPNETCORE_URLS=http://+:80
ENV ACCEPT_EULA=Y
# 自定义SA密码,要求至少8位,包含大小写字母、数字、特殊字符
ENV SA_PASSWORD=Test@123456

# 拷贝.NET应用文件
WORKDIR /App
COPY Binaries/ .

# 拷贝启动初始化脚本,赋予执行权限
COPY entrypoint.sh .
RUN chmod +x entrypoint.sh

# 暴露端口:80为.NET应用端口,1433为SQL Server端口
EXPOSE 80 1433

# 指定入口脚本
ENTRYPOINT ["./entrypoint.sh"]

2. 修改连接字符串

Linux环境没有LocalDB,需要修改appsettings.json中的连接字符串,使用SQL Server的sa账号登录本地实例:

"ConnectionStrings": {
    "Cnxn1": "Server=localhost;Database=ABC;User ID=sa;Password=Test@123456;TrustServerCertificate=True;"
}

3. 编写启动初始化脚本

创建entrypoint.sh脚本,实现SQL Server启动等待、数据库初始化、.NET应用启动的流程控制:

#!/bin/bash

# 后台启动SQL Server服务
/opt/mssql/bin/sqlservr &

# 等待SQL Server启动完成
echo "正在等待SQL Server启动..."
until sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -Q "SELECT 1" > /dev/null 2>&1
do
    sleep 1
done
echo "SQL Server启动成功,开始初始化数据库"

# 数据库初始化二选一即可:
# 方案1(推荐):本地提前导出EF迁移SQL脚本,无需在容器内安装SDK
# 本地开发环境执行 dotnet ef migrations script -o init.sql 导出全量迁移脚本,把init.sql放到Binaries目录一起拷贝到容器
# 执行脚本创建库表:
# sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -i init.sql

# 方案2:容器内直接执行EF Update命令
# 需要先在Dockerfile的apt安装步骤增加 dotnet-sdk-5.0 包,再安装ef工具:
# RUN dotnet tool install --global dotnet-ef
# ENV PATH="$PATH:/root/.dotnet/tools"
# 执行迁移:
# dotnet ef database update

echo "数据库初始化完成,启动.NET应用"
dotnet MyService.dll

4. 构建与运行

  • 执行构建命令:docker build -t mssql-dotnet:v1 .
  • 执行运行命令:docker run -p 8080:80 -d mssql-dotnet:v1

注:该方案仅适用于开发测试场景,单容器内多进程没有独立故障恢复能力,生产环境仍推荐使用多容器编排方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:09:04