SuperAPI AI 工具集

multi-stage-dockerfile

部署与运维

查看项目

更新于 10-15 09:52

技能介绍

用途

该技能旨在帮助用户创建高效的多阶段 Dockerfile,遵循最佳实践,从而生成更小、更安全的容器镜像。它适用于任何语言或框架,触发场景包括创建 Dockerfile、优化容器镜像等。

主要能力

技能围绕多阶段构建提供系统化指导,涵盖以下方面:

  • 多阶段结构:使用构建阶段(builder)进行编译、依赖安装等构建时操作;使用独立的运行阶段(runtime)仅包含运行应用所需内容;仅从构建阶段复制必要产物到运行阶段;使用有意义的阶段名称(如 FROM node:18 AS builder);按逻辑顺序排列阶段:依赖 -> 构建 -> 测试 -> 运行。
  • 基础镜像:优先使用官方、最小化的基础镜像;指定精确版本标签以确保可复现构建(如 python:3.11-slim 而非仅 python);在适当场景考虑 distroless 镜像;在兼容时使用 Alpine 基础镜像以减小体积;确保运行镜像具有最小必要依赖。
  • 层优化:组织命令以最大化层缓存;将频繁变更的命令(如代码变更)放在较少变更的命令(如依赖安装)之后;使用 .dockerignore 防止不必要文件进入构建上下文;用 && 合并相关 RUN 命令以减少层数;考虑使用 COPY --chown 一步设置权限。
  • 安全实践:避免以 root 运行容器,使用 USER 指令指定非 root 用户;从最终镜像中移除构建工具和不必要的包;扫描最终镜像的漏洞;设置严格的文件权限;使用多阶段构建避免将构建密钥包含在最终镜像中。
  • 性能考量:使用构建参数处理可能因环境而变的配置;通过从最少变更到最频繁变更的顺序排列层来高效利用构建缓存;在可能时考虑构建步骤的并行化;设置适当的环境变量(如 NODE_ENV=production)以优化运行时行为;使用 HEALTHCHECK 指令为应用类型设置适当的健康检查。

使用方式

技能通过对比常见反模式与正确做法来指导编写 Dockerfile,并提供多种语言的模板。

常见反模式与正确做法

错误:在运行阶段安装开发依赖

FROM node:20
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "server.js"]

正确:多阶段且仅生产依赖

FROM node:22-slim AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:22-slim
WORKDIR /app
COPY --from=builder /app/package*.json ./
RUN npm ci --omit=dev
COPY --from=builder /app/dist ./dist
USER node
CMD ["node", "dist/server.js"]

错误:破坏层缓存

COPY . .
RUN pip install -r requirements.txt

正确:依赖优先,代码其次

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

错误:以 root 运行且无健康检查

FROM python:3.12
COPY app.py .
CMD ["python", "app.py"]

正确:非 root 用户 + 健康检查

FROM python:3.12-slim
RUN useradd --create-home appuser
WORKDIR /home/appuser
COPY --chown=appuser:appuser app.py .
USER appuser
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8000/health || exit 1
CMD ["python", "app.py"]

语言模板

技能提供以下语言的模板:

  • Node.js (TypeScript):使用 node:22-slim 构建,gcr.io/distroless/nodejs22-debian12 运行,非 root 用户 nonroot。
  • Python (FastAPI/Flask):使用 python:3.12-slim 构建虚拟环境,运行阶段复制虚拟环境,创建 appuser 用户,使用 uvicorn 启动。
  • Go:使用 golang:1.24-alpine 构建静态二进制,gcr.io/distroless/static-debian12 运行,非 root 用户 nonroot。
  • Rust:使用 rust:1.82-slim 构建,debian:bookworm-slim 运行,创建 appuser 用户。
  • Java (Spring Boot / Gradle):使用 eclipse-temurin:21-jdk-alpine 构建,eclipse-temurin:21-jre-alpine 运行,创建 appuser 用户,包含健康检查。
  • Bun (Server or API):使用 oven/bun:1-alpine 构建和运行,创建 app 用户,包含健康检查。注意:Bun 1.2+ 使用基于文本的 bun.lock(替代旧版 bun.lockb);固定 Bun 主版本,不要使用 :latest。
  • Deno (API or CLI):使用 denoland/deno:2-alpine 构建并编译为自包含二进制,alpine:3.20 运行,创建 app 用户,包含健康检查。注意:Deno 2 提供 deno compile 生成自包含二进制,运行镜像可以是纯 alpine 且无需安装 Deno;需显式声明所需权限,Deno 拒绝未知权限。

.dockerignore 模板

始终在 Dockerfile 旁创建 .dockerignore:

.git
.gitignore
.env*
*.md
LICENSE
docker-compose*.yml
Dockerfile*
node_modules
__pycache__
*.pyc
.pytest_cache
.mypy_cache
.venv
target/
build/
dist/
.idea
.vscode
*.log
coverage/
.next

根据具体语言调整——移除不适用的条目,添加框架特定的构建产物。

验证清单

在最终确定 Dockerfile 前,验证:

  • 多阶段构建分离构建时与运行时依赖
  • 基础镜像使用精确版本标签(无 latest)
  • 运行镜像最小化(slim、alpine 或 distroless)
  • 依赖在源代码之前复制(层缓存)
  • USER 指令在最终阶段设置非 root 用户
  • 服务容器存在 HEALTHCHECK 指令
  • .dockerignore 存在并排除构建产物、.git、.env
  • 镜像中未烘焙密钥或凭证
  • EXPOSE 记录监听端口
  • 使用构建参数处理环境特定配置

适用场景

适用于需要创建或优化 Dockerfile 的开发者,尤其是希望减小镜像体积、提升安全性、优化构建缓存的场景。支持多种主流语言和框架。

限制

资料未提供关于该技能的具体限制、收费、价格或平台信息。