用途
docker-ops 是一份关于 Docker 容器化模式的技能文档,适用于构建、运行和编排容器化应用。它围绕 Dockerfile、多阶段构建与 Docker Compose 提供实践指导。原文明确其使用场景包括:docker、Dockerfile、docker-compose、container 等。
主要能力
Dockerfile 最佳实践
文档以对照表形式列出推荐做法与应避免做法,包括:
- 基础镜像:使用
FROM node:20-slim,避免FROM node:latest。 - 层缓存:先复制依赖文件,再复制源码,避免先
COPY . .后安装。 - 包安装:
apt-get update && apt-get install -y ... && rm -rf /var/lib/apt/lists/*,避免 update 与 install 分开 RUN。 - 用户:使用
USER nonroot(必要时创建),避免生产环境以 root 运行。 - 多阶段:分离构建与运行阶段,避免携带编译器工具链。
- 密钥:使用
--mount=type=secret(BuildKit),避免COPY .env .或ARG PASSWORD。 - ENTRYPOINT 与 CMD:ENTRYPOINT 用于固定二进制,CMD 用于默认值,避免依赖 shell 形式处理信号。
- WORKDIR:使用
WORKDIR /app,避免RUN cd /app && ...。 - .dockerignore:应包含
.git、node_modules、__pycache__。 - 标签:使用
LABEL org.opencontainers.image.*。
多阶段构建决策
按语言选择运行时基础镜像:
- Go:禁用 CGO 时用 scratch 或 distroless/static;否则用 distroless/base 或 alpine。
- Rust:静态 musl 时用 scratch 或 distroless/static;否则用 distroless/cc 或 debian-slim。
- Node.js:需要原生模块时用 node:20-slim;否则用更小的 node:20-alpine。
- Python:需要 C 库时用 python:3.12-slim;否则仍用 python:3.12-slim。
- Java:仅 JRE 时用 eclipse-temurin:21-jre-alpine。
完整示例见 references/multi-stage-builds.md。
层缓存规则
Docker 缓存每一层,第 N 层缓存失效会使后续所有层失效。导致缓存失效的因素包括:COPY/ADD 中文件变更、RUN 命令文本变更、ARG 值变更、--no-cache 标志、基础镜像更新。
最优层顺序为:基础镜像 → 系统依赖 → 依赖文件 → 应用代码 → 运行时配置。经验法则:按变化频率从低到高排列层。
.dockerignore 要点
应忽略版本控制文件(.git、.gitignore)、依赖(node_modules、pycache、.pyc、.venv、vendor/)、构建产物(dist/、build/、target/、.egg-info)、IDE 文件、Docker 文件(防止递归上下文)、环境与密钥(.env、.pem、.key)、文档与测试。若无 .dockerignore,docker build 会把整个上下文目录发送到守护进程,仅 .git 文件夹就可能增加数百 MB。
Docker Compose 快速参考
服务定义示例包含 build(context、dockerfile、target)、image、ports、environment、env_file、volumes(绑定挂载与命名卷)、depends_on(condition: service_healthy)、healthcheck、restart、networks。
卷与网络示例包含命名卷、driver,以及 bridge 驱动的后端与前端网络。完整模式(profiles、watch 模式、override 文件)见 references/compose-patterns.md。
对于带 .ddev/ 文件夹的 PHP/CMS 项目,DDEV 会生成自己的 compose 文件,不要手写并行栈;应使用 ddev-ops,额外服务放在 .ddev/docker-compose.<name>.yaml 中。
安全快速参考
- 用户:以非 root 运行,如
RUN adduser -D appuser && USER appuser。 - 基础镜像:固定 digest,如
FROM python:3.12-slim@sha256:abc123...。 - 文件系统:只读根,如
docker run --read-only --tmpfs /tmp。 - 能力:全部丢弃后按需添加,如
--cap-drop=ALL --cap-add=NET_BIND_SERVICE。 - 密钥:BuildKit 密钥,如
RUN --mount=type=secret,id=key cat /run/secrets/key。 - 扫描:使用
trivy image myapp:latest或grype myapp:latest。 - 不使用 latest,固定具体标签与版本。
- 尽量使用 distroless 或 scratch 等最小镜像。
- 去除 SUID:
RUN find / -perm /6000 -type f -exec chmod a-s {} +。 - 网络:后端服务使用内部网络。
非 root 用户模式给出 Debian/Ubuntu、Alpine 与 Distroless 三种写法。
常见陷阱与修复
文档列出大镜像、缓存失效、密钥进入层、PID 1 问题、时区、DNS 缓存、apt 缓存、信号缺失、构建上下文大小、层爆炸等陷阱及其修复方式,并提供 PID 1 / 信号处理修复示例(tini、docker run --init、在代码中处理信号)。
常用 Docker 命令
包含 build(含 --target、--no-cache)、run(含 --rm -it、--read-only)、inspect(images、history、inspect)、调试(exec、logs、stats)、清理(system prune、image prune)等命令示例。
参考文件
- references/multi-stage-builds.md:各语言多阶段模式(Go、Rust、Node、Python)。
- references/compose-patterns.md:Compose 服务、网络、profiles、watch、overrides。
- references/optimization.md:镜像大小、BuildKit、安全扫描、调试。
在 RUN 步骤中仅从锁文件安装:npm ci(或对应管理器的冻结安装)以及 composer install --no-dev --optimize-autoloader。各管理器所需命令及为何镜像中使用 npm install 是 bug,见 package-manager-ops。
使用方式
该技能通过名称 docker-ops 引用,来源为 0xdarkmatter/claude-mods,URL 为 https://www.skills.sh/0xdarkmatter/claude-mods/docker-ops。原文未提供具体安装步骤或调用命令。
适用场景
适用于需要编写或优化 Dockerfile、设计多阶段构建、配置 Docker Compose、加固容器安全、排查镜像大小与缓存问题的场景。
限制
原文未提供收费、价格、平台支持范围等具体信息。技能的实际可用性与集成方式需参考其来源仓库。