关于 container-development
面向容器化应用开发与运维的技能,涵盖 Dockerfile、编排和安全优先的镜像优化,侧重跨语言实践。
主要功能
- 01多阶段 Dockerfile 模式
- 02非 root 与精简镜像安全
- 03镜像体积和层优化
- 0412-Factor 配置指导
- 05健康检查与编排模式
适用场景
- 01加固生产容器镜像
- 02设计多阶段构建
- 03使用 Docker Compose 组合服务
- 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 工作流:为容器化应用设计高效的开发循环
- 编排模式:设计服务网格、负载均衡和容器通信
- 性能调优:优化容器资源使用、启动时间和运行时性能
镜像构建流程
- 分析:了解应用依赖和构建流程
- 规划结构:设计多阶段 Dockerfile,分离构建时和运行时需求
- 忽略文件:创建全面的
.dockerignore文件 - 构建并扫描:构建镜像并扫描漏洞
- 改进:通过迭代优化层缓存、缩减镜像大小并解决安全问题
- 验证:确保镜像运行正常并遵循 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 命令
版本检查
重要:使用基础镜像前,请确认最新版本:
- Node.js Alpine:在 Docker Hub node 查看最新的 LTS 版本
- Python slim:在 Docker Hub python 查看最新版本
- Go Alpine:在 Docker Hub golang 查看最新版本
- nginx Alpine:查看 Docker Hub nginx
- Distroless:在 Google distroless 查看最新版本
使用 WebSearch 或 WebFetch 验证当前版本。
特定语言的优化
有关特定语言的详细优化模式,请参阅相应的技能:
| 语言 | 技能 | 主要优化 | 典型缩减幅度 |
|---|---|---|---|
| Go | go-containers | 静态二进制文件、scratch/distroless | 846MB → 2.5MB(99.7%) |
| Node.js | nodejs-containers | Alpine、多阶段构建、npm/yarn/pnpm | 900MB → 100MB(89%) |
| Python | python-containers | Slim(不要使用 Alpine)、uv、venv | 1GB → 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.licenses | SPDX 许可证标识符(最多 256 个字符) | MIT、Apache-2.0 |
推荐标签
| 标签 | 用途 | 示例 |
|---|---|---|
org.opencontainers.image.version | 语义化版本 | 1.2.3 |
org.opencontainers.image.revision | Git 提交 SHA | abc1234 |
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 | 文档 URL | https://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 开发配置