关于 containerize-aspnetcore
用于将 ASP.NET Core 项目容器化的提示词技能,依据项目和配置要求生成 Linux Docker 容器所需的文件与设置。涵盖多阶段构建、依赖处理、健康检查和构建验证,不负责基础设施部署。
主要功能
- 01按项目设置配置容器
- 02创建多阶段 Dockerfile
- 03生成 .dockerignore
- 04处理依赖与环境变量
- 05配置可选健康检查
- 06验证 Docker 镜像构建
适用场景
- 01为 ASP.NET Core 项目创建 Dockerfile
- 02按指定 Linux 发行版构建容器
- 03配置端口、用户和应用环境
- 04验证容器镜像能否构建
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ github/ awesome-copilot --skill containerize-aspnetcore安装后在 Claude Code 中输入/containerize-aspnetcore确认已加载。
详细介绍
ASP.NET Core Docker 容器化提示词
容器化请求
将下方设置中指定的 ASP.NET Core (.NET) 项目容器化,仅聚焦于使应用程序能够在 Linux Docker 容器中运行所需的更改。容器化应考虑此处指定的所有设置。
遵循容器化 .NET Core 应用程序的最佳实践,确保容器针对性能、安全性和可维护性进行优化。
容器化设置
提示词的本节包含容器化 ASP.NET Core 应用程序所需的特定设置和配置。在运行此提示词之前,请确保设置已填写必要信息。请注意,在许多情况下,仅需前几项设置。如果后续设置不适用于要容器化的项目,可保留为默认值。
任何未指定的设置将设置为默认值。默认值在 [方括号] 中提供。
基本项目信息
-
要容器化的项目:
[ProjectName(提供 .csproj 文件的路径)]
-
要使用的 .NET 版本:
[8.0 或 9.0(默认 8.0)]
-
要使用的 Linux 发行版:
[debian、alpine、ubuntu、chiseled 或 Azure Linux (mariner)(默认 debian)]
-
Docker 镜像构建阶段的自定义基础镜像("None" 表示使用标准 Microsoft 基础镜像):
[指定用于构建阶段的基础镜像(默认 None)]
-
Docker 镜像运行阶段的自定义基础镜像("None" 表示使用标准 Microsoft 基础镜像):
[指定用于运行阶段的基础镜像(默认 None)]
容器配置
-
必须在容器镜像中暴露的端口:
- 主 HTTP 端口:
[例如,8080] - 其他端口:
[列出任何其他端口,或 "None"]
- 主 HTTP 端口:
-
容器应以其身份运行的用户帐户:
[用户帐户,或默认为 "$APP_UID"]
-
应用程序 URL 配置:
[指定 ASPNETCORE_URLS,或默认为 "http://+:8080"]
构建配置
-
在构建容器镜像之前必须执行的自定义构建步骤:
[列出任何特定构建步骤,或 "None"]
-
在构建容器镜像之后必须执行的自定义构建步骤:
[列出任何特定构建步骤,或 "None"]
-
必须配置的 NuGet 包源:
[列出任何带有身份验证详细信息的私有 NuGet 源,或 "None"]
依赖项
-
必须在容器镜像中安装的系统包:
[所选 Linux 发行版的包名称,或 "None"]
-
必须复制到容器镜像的本机库:
[库名称和路径,或 "None"]
-
必须安装的其他 .NET 工具:
[工具名称和版本,或 "None"]
系统配置
- 必须在容器镜像中设置的环境变量:
[变量名称和值,或 "Use defaults"]
文件系统
-
需要复制到容器镜像的文件/目录:
[相对于项目根目录的路径,或 "None"]- 容器中的目标位置:
[容器路径,或 "Not applicable"]
-
要从容器化中排除的文件/目录:
[要排除的路径,或 "None"]
-
应配置的卷挂载点:
[用于持久化数据的卷路径,或 "None"]
.dockerignore 配置
- 要包含在
.dockerignore文件中的模式(.dockerignore 已包含常见默认值;这些是附加模式):- 附加模式:
[列出任何附加模式,或 "None"]
- 附加模式:
健康检查配置
-
健康检查终结点:
[健康检查 URL 路径,或 "None"]
-
健康检查间隔和超时:
[间隔和超时值,或 "Use defaults"]
附加说明
-
将项目容器化时必须遵循的其他说明:
[具体要求,或“无”]
-
需要解决的已知问题:
[描述任何已知问题,或“无”]
范围
- ✅ 修改应用配置,以确保应用程序设置和连接字符串可从环境变量中读取
- ✅ 为 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 或文档中所示的标签
- 用于构建阶段和运行时阶段的官方 Microsoft .NET 镜像:
- SDK 镜像标签(用于构建阶段):https://github.com/dotnet/dotnet-docker/blob/main/README.sdk.md
- ASP.NET Core 运行时镜像标签:https://github.com/dotnet/dotnet-docker/blob/main/README.aspnet.md
- .NET 运行时镜像标签:https://github.com/dotnet/dotnet-docker/blob/main/README.runtime.md
- 在项目目录的根目录中创建 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 文件,结构如下:
# Containerization Progress
## Environment Detection
- [ ] .NET version detection (version: ___)
- [ ] Linux distribution selection (distribution: ___)
## Configuration Changes
- [ ] Application configuration verification for environment variable support
- [ ] NuGet package source configuration (if applicable)
## Containerization
- [ ] Dockerfile creation
- [ ] .dockerignore file creation
- [ ] Build stage created with SDK image
- [ ] csproj file(s) copied for package restore
- [ ] NuGet.config copied if applicable
- [ ] Runtime stage created with runtime image
- [ ] Non-root user configuration
- [ ] Dependency handling (system packages, native libraries, tools, etc.)
- [ ] Health check configuration (if applicable)
- [ ] Special requirements implementation
## Verification
- [ ] Review containerization settings and make sure that all requirements are met
- [ ] Docker build success
步骤之间不要停下来等待确认。要有条不紊地继续,直到应用程序完成容器化并且 Docker 构建成功。
在所有复选框都被勾选之前,你都没有完成! 这包括成功构建 Docker 镜像,并解决构建过程中出现的任何问题。
Dockerfile 示例
一个使用 Linux 基础镜像的 ASP.NET Core(.NET)应用程序的 Dockerfile 示例。
# ============================================================
# Stage 1: Build and publish the application
# ============================================================
# Base Image - Select the appropriate .NET SDK version and Linux distribution
# Possible tags include:
# - 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)
# Uses the .NET SDK image for building the application
FROM mcr.microsoft.com/dotnet/sdk:8.0-bookworm-slim AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
# Copy project files first for better caching
COPY ["YourProject/YourProject.csproj", "YourProject/"]
COPY ["YourOtherProject/YourOtherProject.csproj", "YourOtherProject/"]
# Copy NuGet configuration if it exists
COPY ["NuGet.config", "."]
# Restore NuGet packages
RUN dotnet restore "YourProject/YourProject.csproj"
# Copy source code
COPY . .
# Perform custom pre-build steps here, if needed
# RUN echo "Running pre-build steps..."
# Build and publish the application
WORKDIR "/src/YourProject"
RUN dotnet build "YourProject.csproj" -c $BUILD_CONFIGURATION -o /app/build
# Publish the application
RUN dotnet publish "YourProject.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
# Perform custom post-build steps here, if needed
# RUN echo "Running post-build steps..."
# ============================================================
# Stage 2: Final runtime image
# ============================================================
# Base Image - Select the appropriate .NET runtime version and Linux distribution
# Possible tags include:
# - 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 image for running the application
FROM mcr.microsoft.com/dotnet/aspnet:8.0-bookworm-slim AS final
# Install system packages if needed (uncomment and modify as needed)
# RUN apt-get update && apt-get install -y \
# curl \
# wget \
# ca-certificates \
# libgdiplus \
# && rm -rf /var/lib/apt/lists/*
# Install additional .NET tools if needed (uncomment and modify as needed)
# RUN dotnet tool install --global dotnet-ef --version 8.0.0
# ENV PATH="$PATH:/root/.dotnet/tools"
WORKDIR /app
# Copy published application from build stage
COPY --from=build /app/publish .
# Copy additional files if needed (uncomment and modify as needed)
# COPY ./config/appsettings.Production.json .
# COPY ./certificates/ ./certificates/
# Set environment variables
ENV ASPNETCORE_ENVIRONMENT=Production
ENV ASPNETCORE_URLS=http://+:8080
# Add custom environment variables if needed (uncomment and modify as needed)
# ENV CONNECTIONSTRINGS__DEFAULTCONNECTION="your-connection-string"
# ENV FEATURE_FLAG_ENABLED=true
# Configure SSL/TLS certificates if needed (uncomment and modify as needed)
# ENV ASPNETCORE_Kestrel__Certificates__Default__Path=/app/certificates/app.pfx
# ENV ASPNETCORE_Kestrel__Certificates__Default__Password=your_password
# Expose the port the application listens on
EXPOSE 8080
# EXPOSE 8081 # Uncomment if using HTTPS
# Install curl for health checks if not already present
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
# Configure health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
# Create volumes for persistent data if needed (uncomment and modify as needed)
# VOLUME ["/app/data", "/app/logs"]
# Switch to non-root user for security
USER $APP_UID
# Set the entry point for the application
ENTRYPOINT ["dotnet", "YourProject.dll"]
调整此示例
注意: 根据容器化设置中的具体需求自定义此模板。
在调整此示例 Dockerfile 时:
- 将
YourProject.csproj、YourProject.dll等替换为你实际的项目名称 - 根据需要调整 .NET 版本和 Linux 发行版
- 根据你的需求修改依赖安装步骤,并移除任何不必要的步骤
- 配置特定于你的应用程序的环境变量
- 根据你的具体工作流添加或移除阶段
- 更新健康检查端点,使其与你的应用程序的健康检查路由相匹配
Linux 发行版变体
Alpine Linux
如需更小的镜像体积,你可以使用 Alpine Linux:
FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build
# ... build steps ...
FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS final
# Install packages using apk
RUN apk update && apk add --no-cache curl ca-certificates
Ubuntu Chiseled
如需最小化攻击面,请考虑使用 chiseled 镜像:
FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy-chiseled AS final
# Note: Chiseled images have minimal packages, so you may need to use a different base for additional dependencies
Azure Linux(Mariner)
如需针对 Azure 优化的容器:
FROM mcr.microsoft.com/dotnet/aspnet:8.0-azurelinux3.0 AS final
# Install packages using tdnf
RUN tdnf update -y && tdnf install -y curl ca-certificates && tdnf clean all
关于阶段命名的说明
AS stage-name语法为每个阶段赋予一个名称- 使用
--from=stage-name从之前的阶段复制文件 - 你可以有多个不用于最终镜像的中间阶段
final阶段是成为最终容器镜像的那个阶段
安全最佳实践
- 在生产环境中始终以非 root 用户运行
- 使用具体的镜像标签,而不是
latest - 尽量减少已安装软件包的数量
- 保持基础镜像更新
- 使用多阶段构建,将构建依赖从最终镜像中排除