关于 docker-best-practices
供开发者创建和审查 Docker 镜像及 Compose 配置的参考技能,重点涉及构建阶段划分、镜像效率、运行安全和密钥处理。
主要功能
- 01多阶段构建
- 02Docker Compose 配置
- 03.dockerignore 指引
- 04镜像大小与层分析
- 05运行时安全检查清单
适用场景
- 01分离构建产物与运行时文件
- 02缩小构建上下文并减少镜像层
- 03检查容器用户和基础镜像设置
- 04审查 Dockerfile 中的密钥处理
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ rohitg00/ awesome-claude-code-toolkit --skill docker-best-practices安装后在 Claude Code 中输入/docker-best-practices确认已加载。
详细介绍
Docker 最佳实践
多阶段构建
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --only=production
FROM node:22-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:22-alpine AS runtime
WORKDIR /app
RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001 -G appgroup
COPY --from=deps /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist
COPY --from=build /app/package.json ./
USER appuser
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:3000/healthz || exit 1
CMD ["node", "dist/server.js"]
将依赖安装与构建步骤分开。最终阶段仅包含运行时文件。
Python 多阶段构建
FROM python:3.12-slim AS builder
WORKDIR /app
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
FROM python:3.12-slim
WORKDIR /app
RUN useradd --create-home appuser
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
COPY . .
USER appuser
CMD ["gunicorn", "app:create_app()", "-b", "0.0.0.0:8000", "-w", "4"]
Docker Compose
services:
api:
build:
context: .
dockerfile: Dockerfile
target: runtime
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/app
- REDIS_URL=redis://cache:6379
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
restart: unless-stopped
deploy:
resources:
limits:
memory: 512M
db:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_DB: app
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d app"]
interval: 5s
timeout: 3s
retries: 5
cache:
image: redis:7-alpine
command: redis-server --maxmemory 128mb --maxmemory-policy allkeys-lru
volumes:
pgdata:
.dockerignore
node_modules
.git
.env*
*.md
docker-compose*.yml
.github
coverage
dist
始终包含 .dockerignore,以缩小构建上下文并防止泄露机密。
镜像优化技巧
# Check image size breakdown
docker history --human --no-trunc <image>
# Use dive for layer analysis
dive <image>
# Multi-arch build
docker buildx build --platform linux/amd64,linux/arm64 -t registry/app:1.0 --push .
合并 RUN 命令以减少层数。按照指令变更频率从低到高的顺序排列,以提高缓存效率。
反模式
- 在容器内以 root 身份运行
- 当
COPY已足够时仍使用ADD(ADD 会自动解压 tar 包并拉取 URL) - 在 Dockerfile 的环境变量中存储机密
- 未固定基础镜像版本(
FROM node:latest) - 缺少
.dockerignore,导致构建上下文过大 - 在生产镜像中安装开发依赖
检查清单
- 多阶段构建将构建阶段与运行阶段分开
- 创建非 root 用户,并通过
USER指令使用该用户 - 将基础镜像固定为特定版本(例如
node:22-alpine) -
.dockerignore排除.git、node_modules、.env - 定义
HEALTHCHECK指令 - 生产镜像不包含构建工具或开发依赖
-
docker-compose使用带有健康条件的depends_on - 通过构建机密或运行时挂载传递机密,而非在 Dockerfile 中使用
ENV
评论
支持 Markdown