mcpField
C
container-development

container-development

github.com/laurigates云与 DevOps5960 次安装1 天前更新
代码仓库

关于 container-development

面向容器化应用开发与运维的技能,涵盖 Dockerfile、编排和安全优先的镜像优化,侧重跨语言实践。

主要功能

  1. 01多阶段 Dockerfile 模式
  2. 02非 root 与精简镜像安全
  3. 03镜像体积和层优化
  4. 0412-Factor 配置指导
  5. 05健康检查与编排模式

适用场景

  1. 01加固生产容器镜像
  2. 02设计多阶段构建
  3. 03使用 Docker Compose 组合服务
  4. 04改进容器开发工作流

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/laurigates/claude-plugins --skill container-development

安装后在 Claude Code 中输入/container-development确认已加载。

附带文件REFERENCE.md

详细介绍

容器开发

专注于安全优先、精简容器镜像和 12-Factor 应用方法论的容器化与编排专业知识。

适用场景

在以下情况下使用此技能……在以下情况下改用特定语言的同类技能(go-containers、nodejs-containers、python-containers)……
编写或优化与语言无关的 Dockerfile优化 Go 静态二进制文件、Node.js Alpine 构建或 Python slim 镜像
编写多阶段构建模式或 12-Factor 配置镜像大小主要受语言运行时选择(scratch、distroless、musl/glibc)影响
加固容器(非 root、精简基础镜像、机密信息)运行 Skaffold 同步(skaffold-filesync)或 OrbStack 网络(skaffold-orbstack)
使用 Docker Compose 组合服务工作仅涉及 Skaffold 部署前测试(skaffold-testing)

安全理念(不可妥协)

必须使用非 root 用户:所有生产容器都必须以非 root 用户身份运行。这不是可选项。

精简基础镜像:Node.js/Go/Rust 使用 Alpine(约 5 MB)。Python 使用 slim(Alpine 存在 musl 兼容性问题,slim 约 50 MB)。

必须采用多阶段构建:分离构建环境和运行时环境。生产镜像中不得包含构建工具。

核心专长

容器镜像构建

  • Dockerfile/Containerfile 编写:编写清晰、高效且易于维护的容器构建指令
  • 多阶段构建:创建精简的生产就绪镜像
  • 镜像优化:缩减镜像大小、减少层数、优化构建缓存
  • 安全加固:使用非 root 用户、精简基础镜像、扫描漏洞

容器编排

  • 服务架构:构建具备适当服务发现机制的微服务
  • 资源管理:设置 CPU/内存限制、自动扩缩策略和资源配额
  • 健康与监控:健康检查、就绪探针、可观测性模式
  • 配置管理:环境变量、机密信息和配置管理

核心能力

  • 遵循 12-Factor 原则:确保容器化应用遵循 12-Factor 原则,尤其是配置和无状态性
  • 健康与可靠性:实施适当的健康检查、就绪探针和重启策略
  • Skaffold 工作流:为容器化应用设计高效的开发循环
  • 编排模式:设计服务网格、负载均衡和容器通信
  • 性能调优:优化容器资源使用、启动时间和运行时性能

镜像构建流程

  1. 分析:了解应用依赖和构建流程
  2. 规划结构:设计多阶段 Dockerfile,分离构建时和运行时需求
  3. 忽略文件:创建全面的 .dockerignore 文件
  4. 构建并扫描:构建镜像并扫描漏洞
  5. 改进:通过迭代优化层缓存、缩减镜像大小并解决安全问题
  6. 验证:确保镜像运行正常并遵循 12-Factor 原则

最佳实践

核心优化原则

1. 多阶段构建(必须):

  • 将构建时依赖与运行时依赖分开
  • 不要将构建工具放入生产镜像
  • 通常可将最终镜像缩小 60-90%

2. 精简基础镜像:

  • 从满足需求的最小基础镜像开始
  • 大多数语言优先选择 Alpine(Python 除外)
  • 如需最高安全性,可考虑 distroless

3. 非 root 用户(必须):

  • 始终创建并使用非 root 用户
  • 明确设置 UID/GID(例如,1001)
  • 这是安全合规要求

4. .dockerignore(必须):

  • 排除 .git、node_modules、__pycache__
  • 防止机密信息和开发文件进入镜像
  • 将构建上下文缩小 90-98%

5. 层优化:

  • 单独复制依赖清单文件,再复制源代码
  • 将频繁变更的层放在最后
  • 使用 && 合并相关的 RUN 命令

版本检查

重要:使用基础镜像前,请确认最新版本:

使用 WebSearch 或 WebFetch 验证当前版本。

特定语言的优化

有关特定语言的详细优化模式,请参阅相应的技能:

语言技能主要优化典型缩减幅度
Gogo-containers静态二进制文件、scratch/distroless846MB → 2.5MB(99.7%)
Node.jsnodejs-containersAlpine、多阶段构建、npm/yarn/pnpm900MB → 100MB(89%)
Pythonpython-containersSlim(不要使用 Alpine)、uv、venv1GB → 100MB(90%)
基础镜像快速指南

选择合适的基础镜像:

  • Go:scratch 或 distroless/static(2-5MB)
  • Node.js:node:XX-alpine(50-150MB)
  • Python:python:XX-slim(80-120MB)——绝不要在 Python 中使用 Alpine!
  • Nginx:nginx:XX-alpine(20-40MB)
  • 静态文件:scratch 或 nginx:alpine(最小化)
多阶段构建模板
# Build stage - includes all build tools
FROM <language>:<version> AS builder
WORKDIR /app

# Copy dependency manifests first (better caching)
COPY package.json package-lock.json ./  # or go.mod, requirements.txt, etc.

# Install dependencies
RUN <install-command>

# Copy source code
COPY . .

# Build application
RUN <build-command>

# Runtime stage - minimal
FROM <minimal-base>
WORKDIR /app

# Create non-root user
RUN addgroup --gid 1001 appgroup && \
    adduser --uid 1001 --gid 1001 --disabled-password appuser

# Copy only what's needed from builder
COPY --from=builder --chown=appuser:appuser /app/dist ./dist

USER appuser
EXPOSE <port>

HEALTHCHECK --interval=30s CMD <health-check-command>

CMD [<start-command>]

安全要求(强制)

  • 非 root 用户:必须遵守——生产环境中绝不要以 root 身份运行
  • 最小化基础镜像:选择满足需求的最小基础镜像
    • 典型 CVE 缩减:50-100%(完整基础镜像:50-70 个 CVE → 最小化镜像:0-12 个 CVE)
    • 没有 shell = 不会发生 shell 注入攻击
    • 没有包管理器 = 不会发生供应链攻击
  • 多阶段构建:必须使用——避免将构建工具带入运行环境
  • HEALTHCHECK:必须配置,用于 Kubernetes 存活性/就绪性探针
  • 漏洞扫描:在 CI 中使用 Trivy、Grype 或 Docker Scout
  • 固定版本:始终使用特定标签(例如 node:20.10-alpine),绝不要使用 latest
  • .dockerignore:必须配置——防止机密信息、.env、.git 进入镜像

全面优化的典型效果:

  • 镜像大小:减少 85-99%
  • 安全性:CVE 数量减少 70-100%
  • 拉取时间:缩短 80-98%
  • 构建时间:缩短 40-60%(启用适当的缓存时)
  • 内存使用量:降低 60-80%
  • 存储成本:减少 90-99%

12-Factor App 原则

  • 通过环境变量进行配置
  • 无状态进程
  • 显式声明依赖
  • 为服务绑定端口
  • 妥善处理优雅关闭

容器标签(OCI 注解)

容器标签提供用于镜像发现、关联和文档编写的元数据。GitHub Container Registry(GHCR)特别支持 OCI 注解,可将镜像关联到代码仓库并显示描述。

GHCR 必需标签
标签用途示例
org.opencontainers.image.source将镜像关联到代码仓库(启用 GHCR 功能)https://github.com/owner/repo
org.opencontainers.image.description软件包描述(最多 512 个字符)Production API server
org.opencontainers.image.licensesSPDX 许可证标识符(最多 256 个字符)MIT、Apache-2.0
推荐标签
标签用途示例
org.opencontainers.image.version语义化版本1.2.3
org.opencontainers.image.revisionGit 提交 SHAabc1234
org.opencontainers.image.created构建时间戳(RFC 3339)2025-01-19T12:00:00Z
org.opencontainers.image.title易于理解的名称My Application
org.opencontainers.image.vendor组织名称Forum Virium Helsinki
org.opencontainers.image.url项目主页https://example.com
org.opencontainers.image.documentation文档 URLhttps://docs.example.com
在 Dockerfile 中添加标签
# Static labels (set at build time)
LABEL org.opencontainers.image.source="https://github.com/owner/repo" \
      org.opencontainers.image.description="Production API server" \
      org.opencontainers.image.licenses="MIT" \
      org.opencontainers.image.vendor="Forum Virium Helsinki"

# Dynamic labels (via build args)
ARG VERSION=dev
ARG BUILD_DATE
ARG VCS_REF

LABEL org.opencontainers.image.version="${VERSION}" \
      org.opencontainers.image.created="${BUILD_DATE}" \
      org.opencontainers.image.revision="${VCS_REF}"
在构建时添加标签
docker build \
  --label "org.opencontainers.image.source=https://github.com/owner/repo" \
  --label "org.opencontainers.image.description=My container image" \
  --label "org.opencontainers.image.licenses=MIT" \
  --build-arg VERSION=1.2.3 \
  --build-arg BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
  --build-arg VCS_REF=$(git rev-parse --short HEAD) \
  -t myapp:1.2.3 .
使用 docker/metadata-action 的 GitHub Actions

docker/metadata-action 会根据仓库元数据自动生成 OCI 标签:

- id: meta
  uses: docker/metadata-action@v5
  with:
    images: ghcr.io/${{ github.repository }}
    labels: |
      org.opencontainers.image.title=My Application
      org.opencontainers.image.description=Production API server
      org.opencontainers.image.vendor=Forum Virium Helsinki

- uses: docker/build-push-action@v6
  with:
    labels: ${{ steps.meta.outputs.labels }}

metadata-action 自动生成的标签:

  • org.opencontainers.image.source(来自仓库 URL)
  • org.opencontainers.image.revision(来自提交 SHA)
  • org.opencontainers.image.created(构建时间戳)
  • org.opencontainers.image.version(来自标签/引用)

Skaffold 优先选择

  • 本地开发时优先使用 Skaffold,而非 Docker Compose
  • 通过热重载实现持续开发循环
  • 类似生产环境的本地环境

Agent 优化

构建和测试容器时,使用以下优化来加快反馈:

场景命令用途
快速构建DOCKER_BUILDKIT=1 docker build --progress=plain -t app .使用 BuildKit 并输出纯文本
使用缓存构建docker build --cache-from app:latest -t app:new .重用先前构建的层
安全扫描docker scout cves app:latest | head -50快速检查漏洞
大小分析docker images app --format "{{.Size}}"检查镜像大小
层检查docker history app:latest --human --no-trunc分析各层大小
不使用缓存构建docker build --no-cache --progress=plain -t app .强制全新构建
测试容器docker run --rm -it app:latest /bin/sh交互式测试
快速健康检查docker run --rm app:latest timeout 5 /health验证启动情况

构建优化标志:

  • --target=<stage>:仅构建指定阶段(加快迭代)
  • --build-arg BUILDKIT_INLINE_CACHE=1:启用内联缓存
  • --secret id=key,src=file:挂载机密信息,但不将其包含在镜像中

有关 Dockerfile 优化技巧、编排模式、安全加固和 Skaffold 配置的详细信息,请参阅 REFERENCE.md。

相关技能

特定语言的容器优化:

  • go-containers - Go 静态二进制文件、scratch/distroless(846MB → 2.5MB)
  • nodejs-containers - Node.js Alpine 模式、npm/yarn/pnpm(900MB → 100MB)
  • python-containers - Python slim(不要使用 Alpine)、uv/poetry(1GB → 100MB)

相关命令

  • /configure:container - 全面的容器基础设施验证
  • /configure:dockerfile - Dockerfile 专项配置
  • /configure:workflows - 包含容器构建的 GitHub Actions
  • /configure:skaffold - Kubernetes 开发配置

评论

支持 Markdown