通过为项目定制创建 Dockerfile 和 .dockerfile 文件,将 ASP.NET (.NET Framework) 项目进行容器化。
ASP.NET .NET Framework 容器化 Prompt
根据下方容器化设置中指定的 ASP.NET (.NET Framework) 项目进行容器化,仅聚焦于应用在 Windows Docker 容器中运行所需的修改。容器化过程应全面考量此处指明的所有配置项。
切记: 本项目为 .NET Framework 应用,而非 .NET Core。其容器化流程与 .NET Core 应用存在差异。
容器化设置
本节 Prompt 包含容器化 ASP.NET (.NET Framework) 应用所需的具体设置与配置。运行此 Prompt 前,请确认相关设置已填入必要信息。请注意,通常情况下只需填好前几项设置即可;后续设置若不适用于待容器化的项目,保持默认值即可。
未明确指定的设置均将采用默认值。默认值在 [方括号] 中标出。
项目基础信息
-
待容器化的项目:
[ProjectName(提供 .csproj 文件的路径)]
-
使用的 Windows Server SKU:
[Windows Server Core (默认) 或 Windows Server Full]
-
使用的 Windows Server 版本:
[2022、2019 或 2016(默认 2022)]
-
Docker 镜像构建阶段 (build stage) 使用的自定义基础镜像(填 "None" 表示使用微软标准基础镜像):
[指定用于构建阶段的基础镜像(默认 None)]
-
Docker 镜像运行阶段 (run stage) 使用的自定义基础镜像(填 "None" 表示使用微软标准基础镜像):
[指定用于运行阶段的基础镜像(默认 None)]
容器配置
-
容器镜像中需要暴露的端口:
- 主 HTTP 端口:
[例如 80] - 附加端口:
[列出所有附加端口,或填 "None"]
- 主 HTTP 端口:
-
容器运行所使用的用户账号:
[用户账号,或默认为 "ContainerUser"]
-
容器镜像中需要配置的 IIS 设置:
[列出所有具体 IIS 设置,或填 "None"]
构建配置
-
构建容器镜像前必须执行的自定义构建步骤:
[列出具体构建步骤,或填 "None"]
-
构建容器镜像后必须执行的自定义构建步骤:
[列出具体构建步骤,或填 "None"]
依赖项
-
容器镜像中需要注册到 GAC 的 .NET 程序集:
[程序集名称与版本,或填 "None"]
-
需要复制到容器镜像并安装的 MSI 安装包:
[MSI 名称与版本,或填 "None"]
-
容器镜像中必须注册的 COM 组件:
[COM 组件名称,或填 "None"]
系统配置
-
必须添加到容器镜像中的注册表键与值:
[注册表路径与值,或填 "None"]
-
必须在容器镜像中设置的环境变量:
[变量名与值,或填 "Use defaults"]
-
必须在容器镜像中安装的 Windows Server 角色与功能:
[角色/功能名称,或填 "None"]
文件系统
-
需要复制到容器镜像中的文件/目录:
[相对于项目根目录的路径,或填 "None"]- 容器内的目标位置:
[容器内路径,或填 "Not applicable"]
-
需从容器化中排除的文件/目录:
[排除路径,或填 "None"]
.dockerignore 配置
- 需包含在
.dockerignore文件中的匹配模式(.dockerignore已具备通用默认项,此处为追加模式):- 附加模式:
[列出所有附加模式,或填 "None"]
- 附加模式:
健康检查配置
-
健康检查端点:
[健康检查 URL 路径,或填 "None"]
-
健康检查间隔与超时时间:
[间隔与超时时间值,或填 "Use defaults"]
补充说明
-
容器化项目时必须遵循的其他指令:
[具体要求,或填 "None"]
-
需要处理的已知问题:
[描述已知问题,或填 "None"]
适用范围
- ✅ 修改应用配置,确保使用 config builders 从环境变量中读取应用设置 (app settings) 和连接字符串 (connection strings)
- ✅ 为 ASP.NET 应用创建并配置 Dockerfile
- ✅ 在 Dockerfile 中指定多阶段构建 (multi-stage build),分别完成应用构建/发布并将产物复制到最终镜像
- ✅ 配置 Windows 容器平台兼容性(Windows Server Core 或 Full)
- ✅ 正确处理依赖项(GAC 程序集、MSI 安装包、COM 组件)
- ❌ 不包含基础设施搭建(假定已单独处理)
- ❌ 不包含容器化必需修改之外的代码调整
执行流程
- 审查上述容器化设置,明确容器化需求
- 创建
progress.md文件,使用复选框追踪进度 - 检查项目
.csproj文件中的TargetFrameworkVersion节点,确定 .NET Framework 版本 - 根据以下条件选择合适的 Windows Server 容器镜像:
- 从项目检测到的 .NET Framework 版本
- 容器化设置中指定的 Windows Server SKU(Core 或 Full)
- 容器化设置中指定的 Windows Server 版本(2016、2019 或 2022)
- Windows Server Core 镜像标签可查阅:https://github.com/microsoft/dotnet-framework-docker/blob/main/README.aspnet.md#full-tag-listing
- 检查所需 NuGet 包是否已安装。切勿自动安装缺失的包。如果未安装,用户必须手动安装。此时应暂停执行此 Prompt,提示用户使用 Visual Studio NuGet 包管理器或 Visual Studio 包管理器控制台进行安装。所需的包包括:
Microsoft.Configuration.ConfigurationBuilders.Environment
- 修改
web.config文件,添加配置构建器 (configuration builders) 节点与相关设置,以便从环境变量读取应用设置和连接字符串:- 在 configSections 中添加 ConfigBuilders 节点
- 在根节点下添加 configBuilders 节点
- 为 appSettings 和 connectionStrings 配置 EnvironmentConfigBuilder
- 示例结构:
<configSections> <section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false" /> </configSections> <configBuilders> <builders> <add name="Environment" type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Environment" /> </builders> </configBuilders> <appSettings configBuilders="Environment"> <!-- existing app settings --> </appSettings> <connectionStrings configBuilders="Environment"> <!-- existing connection strings --> </connectionStrings>
- 在将要创建 Dockerfile 的文件夹中创建
LogMonitorConfig.json文件,复制本 Prompt 末尾提供的参考LogMonitorConfig.json内容。除非容器化设置中另有指令,否则该文件内容严禁修改,必须与参考内容保持完全一致。- 尤其需注意,切勿更改日志记录的事件级别,若对 EventLog 源使用
Information级别会导致产生不必要的干扰日志。
- 尤其需注意,切勿更改日志记录的事件级别,若对 EventLog 源使用
- 在项目根目录下创建 Dockerfile 以容器化应用
- Dockerfile 应采用多阶段构建:
- 构建阶段 (Build stage):使用 Windows Server Core 镜像构建应用
- 构建阶段必须使用
mcr.microsoft.com/dotnet/framework/sdk基础镜像,除非设置文件中指定了自定义基础镜像 - 优先复制 sln、csproj 及 packages.config 文件
- 若存在 NuGet.config,复制并配置私有包源
- 还原 NuGet 包
- 随后复制其余源码,并使用 MSBuild 将应用构建发布至 C:\publish
- 构建阶段必须使用
- 最终阶段 (Final stage):使用选定的 Windows Server 镜像运行应用
- 最终阶段必须使用
mcr.microsoft.com/dotnet/framework/aspnet基础镜像,除非设置文件中指定了自定义基础镜像 - 将
LogMonitorConfig.json文件复制到容器指定目录(如 C:\LogMonitor) - 从微软官方仓库下载 LogMonitor.exe 到同一目录
- LogMonitor.exe 正确下载地址为:https://github.com/microsoft/windows-container-tools/releases/download/v2.1.1/LogMonitor.exe
- 设置工作目录为 C:\inetpub\wwwroot
- 将构建阶段在 C:\publish 生成的发布产物复制到最终镜像中
- 设置容器入口点 (ENTRYPOINT),配合 ServiceMonitor.exe 运行 LogMonitor.exe 以监控 IIS 服务
ENTRYPOINT [ "C:\\LogMonitor\\LogMonitor.exe", "C:\\ServiceMonitor.exe", "w3svc" ]
- 最终阶段必须使用
- 构建阶段 (Build stage):使用 Windows Server Core 镜像构建应用
- 务必综合考虑容器化设置中的所有需求:
- Windows Server SKU 及版本
- 暴露的端口
- 容器运行用户账号
- IIS 设置
- GAC 程序集注册
- MSI 安装
- COM 组件注册
- 注册表键值
- 环境变量
- Windows 角色与功能
- 文件/目录复制
- 参考本 Prompt 末尾给出的示例构建 Dockerfile,但需确保根据具体项目需求和设置进行定制。
- 重要提示: 除非用户在设置文件中明确要求使用完整的 Windows Server 镜像,否则一律使用 Windows Server Core 基础镜像
- Dockerfile 应采用多阶段构建:
- 在项目根目录下创建
.dockerignore文件,将无需打入 Docker 镜像的文件排除。.dockerignore文件必须至少包含以下基础项,以及容器化设置中额外指定的追加匹配模式:- packages/
- bin/
- obj/
- .dockerignore
- Dockerfile
- .git/
- .github/
- .vs/
- .vscode/
- **/node_modules/
- *.user
- *.suo
- **/.DS_Store
- **/Thumbs.db
- 容器化设置中指定的任何附加模式
- 若设置中有所要求,配置健康检查:
- 若提供了健康检查端点,在 Dockerfile 中添加 HEALTHCHECK 指令
- 将 Dockerfile 引入项目,在项目文件中添加如下节点:
<None Include="Dockerfile" /> - 标记已完成任务:[ ] → [✓]
- 持续推进,直至所有任务完成且 Docker 构建成功
构建与运行验证
在 Dockerfile 完成后,确认 Docker 构建成功。使用以下命令构建 Docker 镜像:
docker build -t aspnet-app:latest .
若构建失败,检查错误日志并对 Dockerfile 或项目配置进行相应调整。汇报成功/失败结果。
进度追踪
维护一个结构如下的 progress.md 文件:
# 容器化进度追踪
## 环境检测
- [ ] .NET Framework 版本检测(版本:___)
- [ ] Windows Server SKU 选择(SKU:___)
- [ ] Windows Server 版本选择(版本:___)
## 配置变更
- [ ] 修改 Web.config 以支持配置构建器
- [ ] NuGet 包源配置(如适用)
- [ ] 复制 LogMonitorConfig.json 并根据设置需求调整
## 容器化实施
- [ ] 创建 Dockerfile
- [ ] 创建 .dockerignore 文件
- [ ] 使用 SDK 镜像创建构建阶段
- [ ] 复制 sln、csproj、packages.config 及(如适用)NuGet.config 以还原依赖包
- [ ] 运行阶段镜像与运行时环境配置...
<!-- truncated for translation batch; full body continues in source -->






