同一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
相关产品推荐
相关产品推荐

