Docker 开发

docker-development
分类通用
作者Alireza Rezvani
许可MIT
评分4.80/5
使用14.2K

Docker 开发

> 镜像更小。构建更快。容器更安全。无需猜测。

一套具有主见的 Docker 工作流,旨在将臃肿的 Dockerfile 转化为生产级容器。涵盖优化、多阶段构建、Compose 编排和安全加固。

这不是 Docker 教程,而是一套关于如何构建容器的具体决策,旨在不浪费时间、空间或增加攻击面。

---

斜杠命令

| 命令 | 功能 |
|---------|-------------|
| /docker:optimize | 分析并优化 Dockerfile 的体积、速度和层缓存 |
| /docker:compose | 根据最佳实践生成或改进 docker-compose.yml |
| /docker:security | 审计 Dockerfile 或运行中的容器是否存在安全问题 |

---

技能激活时机

识别用户输入中的以下模式:

  • “优化这个 Dockerfile”
  • “我的 Docker 构建太慢了”
  • “为这个项目创建 docker-compose”
  • “这个 Dockerfile 安全吗?”
  • “减小我的 Docker 镜像体积”
  • “设置多阶段构建”
  • “[语言/框架] 的 Docker 最佳实践”
  • 任何涉及:Dockerfile, docker-compose, 容器, 镜像体积, 构建缓存, Docker 安全的请求

如果用户提供了 Dockerfile 或希望将某物容器化 $\rightarrow$ 激活此技能。

---

工作流

/docker:optimize — Dockerfile 优化

1. 分析当前状态
- 读取 Dockerfile
- 识别基础镜像及其体积
- 计算层数(每个 RUN/COPY/ADD = 1 层)
- 检查常见的反模式

2. 应用优化清单

code
基础镜像 (BASE IMAGE)
   ├── 使用具体标签,生产环境绝不使用 :latest
   ├── 优先选择 slim/alpine 版本 (debian-slim > ubuntu > debian)
   ├── 在 CI 中固定 digest 以确保可复现性: image@sha256:...
   └── 基础镜像与运行时需求匹配 (不要为编译后的二进制文件使用 python:3.12)

层优化 (LAYER OPTIMIZATION)
├── 使用 && \ 合并相关的 RUN 命令
├── 调整层顺序:最不常变动的在前 (依赖项在源代码之前)
├── 在同一个 RUN 层中清理包管理器缓存
├── 使用 .dockerignore 排除不必要的文件
└── 将构建依赖与运行时依赖分离

构建缓存 (BUILD CACHE)
├── 在复制源代码前先复制依赖文件 (package.json, requirements.txt, go.mod)
├── 将依赖安装与代码复制分在不同层
├── 使用 BuildKit 缓存挂载: --mount=type=cache,target=/root/.cache
└── 避免在安装依赖前执行 COPY . .

多阶段构建 (MULTI-STAGE BUILDS)
├── 第一阶段:构建 (完整 SDK, 构建工具, 开发依赖)
├── 第二阶段:运行时 (最小基础镜像, 仅包含生产产物)
├── 仅使用 COPY --from=builder 复制必要内容
└── 最终镜像应不含构建工具、源代码和开发依赖

3. 生成优化后的 Dockerfile
- 应用所有相关优化
- 添加行内注释解释每项决策
- 报告预计减小的体积

4. 验证

bash
python3 scripts/dockerfile_analyzer.py Dockerfile

/docker:compose — Docker Compose 配置

1. 识别服务
- 应用程序 (web, API, worker)
- 数据库 (postgres, mysql, redis, mongo)
- 缓存 (redis, memcached)
- 队列 (rabbitmq, kafka)
- 反向代理 (nginx, traefik, caddy)

2. 应用 Compose 最佳实践

code
服务 (SERVICES)
   ├── 使用带有 condition: service_healthy 的 depends_on
   ├── 为每个服务添加 healthchecks (健康检查)
   ├── 设置资源限制 (mem_limit, cpus)
   ├── 使用具名卷 (named volumes) 存储持久化数据
   └── 固定镜像版本

网络 (NETWORKING)
├── 创建显式网络 (不要依赖默认网络)
├── 分离前端和后端网络
├── 仅暴露需要外部访问的端口
└── 对仅限后端的网络使用 internal: true

环境变量 (ENVIRONMENT)
├── 使用 env_file 处理密钥,而非内联环境变量
├── 绝不要提交 .env 文件 (添加到 .gitignore)
├── 使用变量替换: ${VAR:-default}
└── 记录所有必需的环境变量

开发 vs 生产 (DEVELOPMENT vs PRODUCTION)
├── 使用 compose profiles 或覆盖文件 (override files)
├── 开发环境:使用绑定挂载 (bind mounts) 实现热重载,暴露调试端口
├── 生产环境:使用具名卷,不暴露调试端口,设置 restart: unless-stopped
└── 使用 docker-compose.override.yml 进行仅限开发的配置

3. 生成 Compose 文件
- 输出包含健康检查、网络和卷的 docker-compose.yml
- 生成包含所有必需变量文档的 .env.example
- 添加开发/生产 profile 注释

/docker:security — 容器安全审计

1. Dockerfile 审计

| 检查项 | 严重程度 | 修复方案 |
|-------|----------|-----|
| 以 root 运行 | 紧急 (Critical) | 创建用户后添加 USER nonroot |
| 使用 :latest 标签 | 高 (High) | 固定到具体版本 |
| ENV/ARG 中包含密钥 | 紧急 (Critical) | 使用 BuildKit secrets: --mount=type=secret |
| COPY 使用宽泛的通配符 | 中 (Medium) | 使用具体路径,添加 .dockerignore |
| 不必要的 EXPOSE | 低 (Low) | 仅暴露应用实际使用的端口 |
| 缺少 HEALTHCHECK | 中 (Medium) | 添加具有适当间隔的 HEALTHCHECK |
| 特权指令 | 高 (High) | 避免使用 --privileged,精简 capabilities |
| 保留包管理器缓存 | 低 (Low) | 在同一个 RUN 层中清理 |

2. 运行时安全检查

| 检查项 | 严重程度 | 修复方案 |
|-------|----------|-----|
| 容器以 root 运行 | 紧急 (Critical) | 在 Dockerfile 或 compose 中设置用户 |
| 根文件系统可写 | 中 (Medium) | 在 compose 中使用 read_only: true |
| 保留所有 capabilities | 高 (High) | 全部丢弃,仅添加必需项: cap_drop: [ALL] |
| 无资源限制 | 中 (Medium) | 设置 mem_limitcpus |
| 主机网络模式 | 高 (High) | 使用 bridge 或自定义网络 |
| 敏感挂载 | 紧急 (Critical) | 生产环境绝不要挂载 /etc, /var/run/docker.sock |
| 未配置日志驱动 | 低 (Low) | 设置 logging: 并限制大小 |

3. 生成安全报告

code
安全审计 — [Dockerfile/镜像名称]
日期: [时间戳]

紧急 (CRITICAL): [数量]
高 (HIGH): [数量]
中 (MEDIUM): [数量]
低 (LOW): [数量]

[详细发现及修复建议]

---

工具链

scripts/dockerfile_analyzer.py

用于 Dockerfile 静态分析的 CLI 工具。

功能:

  • 层数统计与优化建议

  • 基础镜像分析及大小预估

  • 反模式检测 (15+ 条规则)

  • 安全问题标记

  • 多阶段构建检测与验证

  • 支持 JSON 和文本输出

用法:

bash
# 分析 Dockerfile
python3 scripts/dockerfile_analyzer.p

y Dockerfile

JSON 输出

python3 scripts/dockerfile_analyzer.py Dockerfile --output json

侧重安全分析

python3 scripts/dockerfile_analyzer.py Dockerfile --security

检查指定目录

python3 scripts/dockerfile_analyzer.py path/to/Dockerfile
code
### scripts/compose_validator.py

用于验证 docker-compose 文件的 CLI 工具。

功能:

  • 服务依赖验证

  • 健康检查(Healthcheck)存在性检测

  • 网络配置分析

  • 卷挂载验证

  • 环境变量审计

  • 端口冲突检测

  • 最佳实践评分

用法:

bash

验证 compose 文件


python3 scripts/compose_validator.py docker-compose.yml

JSON 输出

python3 scripts/compose_validator.py docker-compose.yml --output json

严格模式(警告即失败)

python3 scripts/compose_validator.py docker-compose.yml --strict
code
---

多阶段构建模式

模式 1:编译型语言 (Go, Rust, C++)

dockerfile

构建阶段

FROM golang:1.22-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /app/server ./cmd/server

运行阶段

FROM gcr.io/distroless/static-debian12 COPY --from=builder /app/server /server USER nonroot:nonroot ENTRYPOINT ["/server"]
code
### 模式 2:Node.js / TypeScript
dockerfile

依赖阶段

FROM node:20-alpine AS deps WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci --production=false

构建阶段

FROM deps AS builder COPY . . RUN npm run build

运行阶段

FROM node:20-alpine WORKDIR /app RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001 COPY --from=builder /app/dist ./dist COPY --from=deps /app/node_modules ./node_modules COPY package.json ./ USER appuser EXPOSE 3000 CMD ["node", "dist/index.js"]
code
### 模式 3:Python
dockerfile

构建阶段

FROM python:3.12-slim AS builder WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir --prefix=/install -r requirements.txt

运行阶段

FROM python:3.12-slim WORKDIR /app RUN groupadd -r appgroup && useradd -r -g appgroup appuser COPY --from=builder /install /usr/local COPY . . USER appuser EXPOSE 8000 CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
code
---

基础镜像决策树

是否为编译后的二进制文件 (Go, Rust, C)? ├── 是 → distroless/static 或 scratch └── 否 ├── 调试时需要 shell 吗? │ ├── 是 → alpine 版本 (例如 node:20-alpine) │ └── 否 → distroless 版本 ├── 需要 glibc (而非 musl) 吗? │ ├── 是 → slim 版本 (例如 python:3.12-slim) │ └── 否 → alpine 版本 └── 需要特定的 OS 软件包吗? ├── 很多 → debian-slim └── 很少 → alpine + apk add
code
---

主动触发检查项

无需询问,直接标记以下问题:

  • Dockerfile 使用 :latest $\rightarrow$ 建议固定到具体的版本标签。
  • 缺少 .dockerignore $\rightarrow$ 创建一个。至少包含:.git, node_modules, __pycache__, .env
  • 在安装依赖前执行 COPY . . $\rightarrow$ 导致缓存失效。应调整顺序,先安装依赖。
  • 以 root 用户运行 $\rightarrow$ 添加 USER 指令。生产环境无一例外。
  • 在 ENV 或 ARG 中包含密钥 $\rightarrow$ 使用 BuildKit 密钥挂载。切勿将密钥固化在镜像层中。
  • 镜像超过 1GB $\rightarrow$ 必须使用多阶段构建。生产镜像不应如此之大。
  • 缺少健康检查 (healthcheck) $\rightarrow$ 添加一个。编排工具(Compose, K8s)需要它来进行正确的生命周期管理。
  • apt-get 未在同一层中清理 $\rightarrow$ rm -rf
rm -rf /var/lib/apt/lists/* 放在同一个 RUN 指令中。

---

安装指南

一键安装(适用于任何工具)

bash git clone https://github.com/alirezarezvani/claude-skills.git cp -r claude-skills/engineering/docker-development ~/.claude/skills/
code
### 多工具安装
bash ./scripts/convert.sh --skill docker-development --tool codex|gemini|cursor|windsurf|openclaw
code
### OpenClaw 安装
bash clawhub install cs-docker-development ```

---

相关技能

  • senior-devops — 更广泛的 DevOps 领域(CI/CD、IaC、监控)。互补关系:容器相关工作使用 docker-development,流水线和基础设施使用 senior-devops。
  • senior-security — 应用安全。互补关系:docker-development 涵盖容器安全,senior-security 涵盖应用层威胁。
  • autoresearch-agent — 可将优化 Docker 构建时间或镜像大小作为可量化的实验进行优化。
  • ci-cd-pipeline-builder — 流水线构建。互补关系:docker-development 负责构建容器,ci-cd-pipeline-builder 负责部署容器。