mcpField
C
containerize-aspnetcore

containerize-aspnetcore

github.com/github云与 DevOps40.5k8.9k 次安装今天更新
代码仓库

关于 containerize-aspnetcore

用于将 ASP.NET Core 项目容器化的提示词技能,依据项目和配置要求生成 Linux Docker 容器所需的文件与设置。涵盖多阶段构建、依赖处理、健康检查和构建验证,不负责基础设施部署。

主要功能

  1. 01按项目设置配置容器
  2. 02创建多阶段 Dockerfile
  3. 03生成 .dockerignore
  4. 04处理依赖与环境变量
  5. 05配置可选健康检查
  6. 06验证 Docker 镜像构建

适用场景

  1. 01为 ASP.NET Core 项目创建 Dockerfile
  2. 02按指定 Linux 发行版构建容器
  3. 03配置端口、用户和应用环境
  4. 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 应用程序所需的特定设置和配置。在运行此提示词之前,请确保设置已填写必要信息。请注意,在许多情况下,仅需前几项设置。如果后续设置不适用于要容器化的项目,可保留为默认值。

任何未指定的设置将设置为默认值。默认值在 [方括号] 中提供。

基本项目信息
  1. 要容器化的项目:

    • [ProjectName(提供 .csproj 文件的路径)]
  2. 要使用的 .NET 版本:

    • [8.0 或 9.0(默认 8.0)]
  3. 要使用的 Linux 发行版:

    • [debian、alpine、ubuntu、chiseled 或 Azure Linux (mariner)(默认 debian)]
  4. Docker 镜像构建阶段的自定义基础镜像("None" 表示使用标准 Microsoft 基础镜像):

    • [指定用于构建阶段的基础镜像(默认 None)]
  5. Docker 镜像运行阶段的自定义基础镜像("None" 表示使用标准 Microsoft 基础镜像):

    • [指定用于运行阶段的基础镜像(默认 None)]
容器配置
  1. 必须在容器镜像中暴露的端口:

    • 主 HTTP 端口:[例如,8080]
    • 其他端口:[列出任何其他端口,或 "None"]
  2. 容器应以其身份运行的用户帐户:

    • [用户帐户,或默认为 "$APP_UID"]
  3. 应用程序 URL 配置:

    • [指定 ASPNETCORE_URLS,或默认为 "http://+:8080"]
构建配置
  1. 在构建容器镜像之前必须执行的自定义构建步骤:

    • [列出任何特定构建步骤,或 "None"]
  2. 在构建容器镜像之后必须执行的自定义构建步骤:

    • [列出任何特定构建步骤,或 "None"]
  3. 必须配置的 NuGet 包源:

    • [列出任何带有身份验证详细信息的私有 NuGet 源,或 "None"]
依赖项
  1. 必须在容器镜像中安装的系统包:

    • [所选 Linux 发行版的包名称,或 "None"]
  2. 必须复制到容器镜像的本机库:

    • [库名称和路径,或 "None"]
  3. 必须安装的其他 .NET 工具:

    • [工具名称和版本,或 "None"]
系统配置
  1. 必须在容器镜像中设置的环境变量:
    • [变量名称和值,或 "Use defaults"]
文件系统
  1. 需要复制到容器镜像的文件/目录:

    • [相对于项目根目录的路径,或 "None"]
    • 容器中的目标位置:[容器路径,或 "Not applicable"]
  2. 要从容器化中排除的文件/目录:

    • [要排除的路径,或 "None"]
  3. 应配置的卷挂载点:

    • [用于持久化数据的卷路径,或 "None"]
.dockerignore 配置
  1. 要包含在 .dockerignore 文件中的模式(.dockerignore 已包含常见默认值;这些是附加模式):
    • 附加模式:[列出任何附加模式,或 "None"]
健康检查配置
  1. 健康检查终结点:

    • [健康检查 URL 路径,或 "None"]
  2. 健康检查间隔和超时:

    • [间隔和超时值,或 "Use defaults"]
附加说明
  1. 将项目容器化时必须遵循的其他说明:

    • [具体要求,或“无”]
  2. 需要解决的已知问题:

    • [描述任何已知问题,或“无”]

范围

  • ✅ 修改应用配置,以确保应用程序设置和连接字符串可从环境变量中读取
  • ✅ 为 ASP.NET Core 应用程序创建和配置 Dockerfile
  • ✅ 在 Dockerfile 中指定多个阶段,以构建/发布应用程序并将输出复制到最终镜像
  • ✅ 配置 Linux 容器平台兼容性(Alpine、Ubuntu、Chiseled 或 Azure Linux (Mariner))
  • ✅ 正确处理依赖项(系统包、本机库、其他工具)
  • ❌ 不进行基础设施设置(假定另行处理)
  • ❌ 除容器化所需更改外,不进行任何代码更改

执行流程

  1. 查看上方的容器化设置,了解容器化要求
  2. 创建 progress.md 文件,用勾选标记跟踪变更
  3. 通过检查项目的 .csproj 文件中的 TargetFramework 元素来确定 .NET 版本
  4. 根据以下条件选择适当的 Linux 容器镜像:
  5. 在项目目录的根目录中创建 Dockerfile,将应用程序容器化
    • Dockerfile 应使用多个阶段:
      • 构建阶段:使用 .NET SDK 镜像构建应用程序
        • 首先复制 csproj 文件
        • 如果存在 NuGet.config,则复制它并配置任何私有源
        • 还原 NuGet 包
        • 然后,复制其余源代码,并将应用程序构建和发布到 /app/publish
      • 最终阶段:使用选定的 .NET 运行时镜像运行应用程序
        • 将工作目录设置为 /app
        • 按要求设置用户(默认设置为非 root 用户(例如 $APP_UID))
          • 除非容器化设置中另有指示,否则不需要创建新用户。使用 $APP_UID 变量指定用户账户。
        • 将构建阶段发布的输出复制到最终镜像
    • 务必考虑容器化设置中的所有要求:
      • .NET 版本和 Linux 发行版
      • 暴露的端口
      • 容器的用户账户
      • ASPNETCORE_URLS 配置
      • 系统包安装
      • 本机库依赖项
      • 其他 .NET 工具
      • 环境变量
      • 文件/目录复制
      • 卷挂载点
      • 健康检查配置
  6. 在项目目录的根目录中创建 .dockerignore 文件,以从 Docker 镜像中排除不必要的文件。.dockerignore 文件必须至少包含以下元素,以及容器化设置中指定的其他模式:
    • bin/
    • obj/
    • .dockerignore
    • Dockerfile
    • .git/
    • .github/
    • .vs/
    • .vscode/
    • **/node_modules/
    • *.user
    • *.suo
    • **/.DS_Store
    • **/Thumbs.db
    • 容器化设置中指定的任何其他模式
  7. 如果容器化设置中指定了健康检查,则配置健康检查:
    • 如果提供了健康检查端点,则在 Dockerfile 中添加 HEALTHCHECK 指令
    • 使用 curl 或 wget 检查健康端点
  8. 将任务标记为已完成:[ ] → [✓]
  9. 继续执行,直到所有任务完成且 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 时:

  1. 将 YourProject.csproj、YourProject.dll 等替换为你实际的项目名称
  2. 根据需要调整 .NET 版本和 Linux 发行版
  3. 根据你的需求修改依赖安装步骤,并移除任何不必要的步骤
  4. 配置特定于你的应用程序的环境变量
  5. 根据你的具体工作流添加或移除阶段
  6. 更新健康检查端点,使其与你的应用程序的健康检查路由相匹配

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
  • 尽量减少已安装软件包的数量
  • 保持基础镜像更新
  • 使用多阶段构建,将构建依赖从最终镜像中排除

评论

支持 Markdown