用途
该技能旨在帮助用户创建高效的多阶段 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 的开发者,尤其是希望减小镜像体积、提升安全性、优化构建缓存的场景。支持多种主流语言和框架。
限制
资料未提供关于该技能的具体限制、收费、价格或平台信息。