创建针对项目定制的 Dockerfile 和 .dockerfile 文件,实现 ASP.NET Core 项目的容器化配置。
ASP.NET Core Docker 容器化 Prompt
容器化需求
对下方配置中指定的 ASP.NET Core (.NET) 项目进行容器化,仅关注应用在 Linux Docker 容器中运行所需的各项变更。容器化过程应充分考虑此处列出的所有配置项。
请遵循 .NET Core 应用容器化的最佳实践,确保容器在性能、安全性和可维护性方面得到全面优化。
容器化配置项
本节包含容器化 ASP.NET Core 应用所需的具体设置与配置。运行此 Prompt 前,请确保已填入必要的信息。注意,大多数情况下只需填写前几项配置;对于不适用于当前项目的后续选项,保留默认值即可。
任何未专门指定的配置项都将使用默认值。默认值在 [方括号] 中给出。
项目基础信息
-
待容器化的项目:
[ProjectName (provide path to .csproj file)]
-
使用的 .NET 版本:
[8.0 or 9.0 (Default 8.0)]
-
使用的 Linux 发行版:
[debian, alpine, ubuntu, chiseled, or Azure Linux (mariner) (Default debian)]
-
Docker 镜像构建阶段(build stage)的自定义基础镜像(填写 "None" 表示使用微软标准基础镜像):
[Specify base image to use for build stage (Default None)]
-
Docker 镜像运行阶段(run stage)的自定义基础镜像(填写 "None" 表示使用微软标准基础镜像):
[Specify base image to use for run stage (Default None)]
容器配置
-
容器镜像中需要暴露的端口:
- 主 HTTP 端口:
[e.g., 8080] - 附加端口:
[List any additional ports, or "None"]
- 主 HTTP 端口:
-
运行容器的用户账号:
[User account, or default to "$APP_UID"]
-
应用 URL 配置:
[Specify ASPNETCORE_URLS, or default to "http://+:8080"]
构建配置
-
构建容器镜像前必须执行的自定义构建步骤:
[List any specific build steps, or "None"]
-
构建容器镜像后必须执行的自定义构建步骤:
[List any specific build steps, or "None"]
-
需要配置的 NuGet 包源:
[List any private NuGet feeds with authentication details, or "None"]
依赖项
-
容器镜像中必须安装的系统软件包:
[Package names for the chosen Linux distribution, or "None"]
-
必须复制到容器镜像中的原生动态库:
[Library names and paths, or "None"]
-
必须安装的附加 .NET 工具:
[Tool names and versions, or "None"]
系统配置
- 必须在容器镜像中设置的环境变量:
[Variable names and values, or "Use defaults"]
文件系统
-
需要复制到容器镜像中的文件/目录:
[Paths relative to project root, or "None"]- 容器中的目标位置:
[Container paths, or "Not applicable"]
-
容器化时需要排除的文件/目录:
[Paths to exclude, or "None"]
-
需要配置的数据卷挂载点:
[Volume paths for persistent data, or "None"]
.dockerignore 配置
- 需要包含在
.dockerignore文件中的匹配规则(.dockerignore 已自带常用默认项,此处为额外添加规则):- 附加匹配规则:
[List any additional patterns, or "None"]
- 附加匹配规则:
健康检查配置
-
健康检查端点:
[Health check URL path, or "None"]
-
健康检查间隔与超时时间:
[Interval and timeout values, or "Use defaults"]
附加指令
-
容器化项目时必须遵守的其他指令:
[Specific requirements, or "None"]
-
需要解决的已知问题:
[Describe any known issues, or "None"]
任务范围
- ✅ 修改应用配置,确保应用程序设置和连接字符串可以从环境变量中读取
- ✅ 为 ASP.NET Core 应用创建并配置 Dockerfile
- ✅ 在 Dockerfile 中指定多阶段构建,以构建/发布应用并将产物复制到最终镜像
- ✅ 配置 Linux 容器平台兼容性(Alpine、Ubuntu、Chiseled 或 Azure Linux (Mariner))
- ✅ 正确处理各种依赖项(系统软件包、原生动态库、附加工具)
- ❌ 不包含基础设施搭建(假定由其他环节独立处理)
- ❌ 不修改容器化范围之外的代码
执行流程
- 审查上述容器化配置项,明确容器化需求
- 创建
progress.md文件,通过复选框跟踪进度 - 检查项目 .csproj 文件中的
TargetFramework元素,确定 .NET 版本 - 根据以下规则选择合适的 Linux 容器镜像:
- 项目中检测到的 .NET 版本
- 容器化配置中指定的 Linux 发行版(Alpine、Ubuntu、Chiseled 或 Azure Linux (Mariner))
- 如果用户未在容器化配置中指定特定的基础镜像,则基础镜像必须是有效的 mcr.microsoft.com/dotnet 镜像,且带有下方示例 Dockerfile 或官方文档中所展示的标签
- 用于构建和运行阶段的微软官方 .NET 镜像:
- 在项目根目录下创建 Dockerfile 以实现应用容器化
- Dockerfile 应使用多阶段构建:
- 构建阶段:使用 .NET SDK 镜像构建应用
- 先复制 csproj 文件
- 若存在 NuGet.config,复制该文件并配置相关私有源
- 还原 NuGet 包
- 接着复制其余源代码,构建应用并发布至 /app/publish
- 最终阶段:使用所选的 .NET 运行时镜像运行应用
- 将工作目录设置为 /app
- 按要求设置运行用户(默认设为非 root 用户,如
$APP_UID)- 除非容器化配置另有要求,否则无需创建新用户,直接使用
$APP_UID变量指定用户账号即可。
- 除非容器化配置另有要求,否则无需创建新用户,直接使用
- 将构建阶段发布的产物复制到最终镜像中
- 构建阶段:使用 .NET SDK 镜像构建应用
- 务必全面落实容器化配置中的所有要求:
- .NET 版本及 Linux 发行版
- 暴露的端口
- 容器运行用户
- ASPNETCORE_URLS 配置
- 系统软件包安装
- 原生动态库依赖
- 附加 .NET 工具
- 环境变量
- 文件/目录复制
- 数据卷挂载点
- 健康检查配置
- Dockerfile 应使用多阶段构建:
- 在项目根目录下创建
.dockerignore文件,排除 Docker 镜像中不需要的文件。.dockerignore文件必须至少包含以下条目以及容器化配置中指定的附加匹配规则:- bin/
- obj/
- .dockerignore
- Dockerfile
- .git/
- .github/
- .vs/
- .vscode/
- **/node_modules/
- *.user
- *.suo
- **/.DS_Store
- **/Thumbs.db
- 容器化配置中指定的任何附加规则
- 若容器化配置中指定了健康检查,配置相关检查:
- 若提供了健康检查端点,在 Dockerfile 中添加 HEALTHCHECK 指令
- 使用 curl 或 wget 检查健康端点
- 将已完成的任务标记为完成:[ ] → [✓]
- 持续推进,直至所有任务完成且 Docker 构建成功
构建与运行验证
Dockerfile 完成后,确认 Docker 构建成功。使用以下命令构建 Docker 镜像:
docker build -t aspnetcore-app:latest .
如果构建失败,请查看错误信息并对 Dockerfile 或项目配置进行相应调整。最后汇报成功或失败状态。
进度追踪
维护一个格式如下的 progress.md 文件:
# 容器化进度跟踪
## 环境检测
- [ ] .NET 版本检测(版本:___)
- [ ] Linux 发行版选择(发行版:___)
## 配置变更
- [ ] 应用配置验证(确保支持环境变量)
- [ ] NuGet 包源配置(如适用)
## 容器化
- [ ] Dockerfile 创建
- [ ] .dockerignore 文件创建
- [ ] 使用 SDK 镜像创建构建阶段
- [ ] 复制 csproj 文件用于包还原
- [ ] 复制 NuGet.config(如适用)
- [ ] 使用运行时镜像创建运行阶段
- [ ] 非 root 用户配置
- [ ] 依赖项处理(系统软件包、原生库、工具等)
- [ ] 健康检查配置(如适用)
- [ ] 特殊需求实现
## 验证
- [ ] 审查容器化配置项,确保满足所有要求
- [ ] Docker 构建成功
各步骤之间无需停顿等待确认,请按部就班地持续推进,直到应用完成容器化且 Docker 构建成功。
只有当所有复选框均已打勾,才算真正完成! 这包括成功构建 Docker 镜像,以及妥善解决构建过程中出现的任何问题。
Dockerfile 示例
以下是基于 Linux 基础镜像的 ASP.NET Core (.NET) 应用 Dockerfile 示例。
# ============================================================
# 阶段 1:构建并发布应用
# ============================================================
# 基础镜像 - 选择合适的 .NET SDK 版本和 Linux 发行版
# 可选标签包括:
# - 8.0-bookworm-slim (Debian 12)
# - 8.0-noble (Ubuntu 24.04)
# - 8.0-alpine (Alpine Linux)
# - 9.0-bookworm-slim (Debian 12)
# - 9.0-noble (Ubuntu 24.04)
# - 9.0-alpine (Alpine Linux)
# 使用 .NET SDK 镜像构建应用
FROM mcr.microsoft.com/dotnet/sdk:8.0-bookworm-slim AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
# 先复制项目文件以提高缓存利用率
COPY ["YourProject/YourProject.csproj", "YourProject/"]
COPY ["YourOtherProject/YourOtherProject.csproj", "YourOtherProject/"]
# 若存在 NuGet 配置文件,进行复制
COPY ["NuGet.config", "."]
# 还原 NuGet 包
RUN dotnet restore "YourProject/YourProject.csproj"
# 复制源代码
COPY . .
# 如有需要,在此处执行自定义的预构建步骤
# RUN echo "Running pre-build steps..."
# 构建并发布应用
WORKDIR "/src/YourProject"
RUN dotnet build "YourProject.csproj" -c $BUILD_CONFIGURATION -o /app/build
# 发布应用
RUN dotnet publish "YourProject.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
# 如有需要,在此处执行自定义的构建后步骤
# RUN echo "Running post-build steps..."
# ============================================================
# 阶段 2:最终运行时镜像
# ============================================================
# 基础镜像 - 选择合适的 .NET 运行时版本和 Linux 发行版
# 可选标签包括:
# - 8.0-bookworm-slim (Debian 12)
# - 8.0-noble (Ubuntu 24.04)
# - 8.0-alpine (Alpine Linux)
# - 8.0-noble-chiseled (Ubuntu 24.04 Chiseled)
# - 8.0-azurelinux3.0 (Azure Linux)
# - 9.0-bookworm-slim (Debian 12)
# - 9.0-noble (Ubuntu 24.04)
# - 9.0-alpine (Alpine Linux)
# - 9.0-noble-chiseled (Ubuntu 24.04 Chiseled)
# - 9.0-azurelinux3.0 (Azure Linux)
# Uses the .NET runtime ima






