production-docker 是一个将演示级 Docker 配置转化为生产级容器基础设施的技能,来源为 vstorm-co/production-stack-skills。其内容基于真实事故:以 root 运行的被入侵容器、部署耗时 8 分钟的 2GB 镜像、泄露到镜像层中的密钥。以下按用途与能力分段介绍。
一、多阶段构建 单阶段构建会把编译器、构建工具和源码带入生产。多阶段构建通过分离构建环境与运行环境解决该问题。技能给出 Python(builder + distroless)与 Node.js(builder + slim 运行时)两套示例 Dockerfile。规则:builder 阶段安装依赖并编译代码;runtime 阶段只复制最终产物;绝不在 runtime 阶段安装 gcc、make、git 等构建工具;使用 COPY --from=builder 挑选所需内容。体积影响:典型 Python 应用从约 1.2GB 降至约 120MB,减少 90% 以上。
二、基础镜像选择 选择支持运行时且最小的镜像,各选项有权衡,技能以表格列出:distroless(约 20–50MB,无 shell、无包管理器,用于生产服务与最高安全性)、alpine:3.x(约 7MB,有 ash 与 apk,需调试且可接受 musl 时使用)、python:3.12-slim / node:22-slim(约 150–200MB,有 bash 与 apt,需要 glibc 兼容时使用)、ubuntu:24.04(约 75MB,用于复杂原生依赖链)。固定规则:按 digest 固定以保证可复现构建;至少按次版本固定,绝不使用 latest;按计划(每月或通过 Dependabot/Renovate)更新 digest。distroless 优势:无 shell 使攻击者无法起 shell,无包管理器无法安装工具,文件系统最小化,CVE 扫描结果更干净。
三、非 root 执行 容器内以 root 运行是最常见的 Docker 安全错误;若攻击者以 UID 0 逃逸,将在宿主机获得 root。技能给出 distroless(USER 65532)、Debian/Ubuntu 与 Alpine 创建专用用户的写法。规则:USER 尽量靠后设置;COPY 使用 --chown;确保应用目录与可写路径归属非 root 用户;如需绑定 80/443 端口,使用反向代理或 CAP_NET_BIND_SERVICE,不要用 root;运行时用 docker exec <container> whoami 验证不应返回 root。
四、BuildKit 密钥 密钥绝不应出现在镜像层中,docker history 或 docker save 即可提取。正确做法是 BuildKit secret 挂载(--mount=type=secret),私库用 --mount=type=ssh。绝不使用 ARG/ENV 存放密钥、COPY .env 或 COPY id_rsa。规则:若 docker history --no-trunc 显示任何密钥值,镜像已被污染,必须重建。
五、层优化与 .dockerignore Docker 自上而下缓存层,应按「基础镜像 → 系统依赖 → 应用依赖 → 应用代码」顺序排列以最大化缓存命中;合并 RUN 命令,同一层内清理(rm -rf /var/lib/apt/lists/*),pip 使用 --no-cache-dir 与 --no-compile。.dockerignore 必须排除 .git、.env、node_modules 等,上下文超过 50MB 通常意味着缺少条目。
六、健康检查与安全扫描 每个生产 Dockerfile 必须有 HEALTHCHECK(HTTP 检查示例含 Python、Node.js、distroless),参数调优建议 interval 30s、timeout 5s、retries 3,start-period 视启动时间放宽;健康端点须验证真实功能(如数据库连接),不要用 curl(distroless 中不存在),使用 exec 形式 CMD。每次构建都应用 Trivy 扫描,CI 中设置 exit-code 1 使 HIGH/CRITICAL 失败,使用 --ignore-unfixed,固定 Trivy 版本,可用 .trivyignore 记录已接受风险。
七、Compose 与运行时加固 Compose 生产实践:使用 depends_on 的 service_healthy 条件、设置资源 limits/reservations、网络隔离(前后端分离)、restart: unless-stopped、命名卷而非 bind mount、env_file 而非硬编码密钥、固定镜像标签、区分 dev 与 prod compose 文件。运行时加固:只读文件系统配合 tmpfs、cap_drop: ALL 再按需添加、no-new-privileges:true,并给出 docker run 等价命令。
八、反模式与快速参考 技能列出常见反模式对照表,如以 root 运行、FROM python:latest、无 .dockerignore、ARG SECRET、单阶段构建、生产环境含 dev 依赖、pip 未用 --no-cache-dir、apt 未清理、无 HEALTHCHECK、compose 硬编码密钥、无资源限制、使用已弃用的 docker-compose v1、EXPOSE 未绑定 0.0.0.0。快速参考提供生产构建命令、非 root 验证、镜像大小查看与层内密钥扫描命令。
限制:该技能聚焦 Docker 构建与运行加固实践;具体平台、收费、价格等信息暂未提供。