mcpField
D
docker-best-practices

docker-best-practices

github.com/rohitg00云与 DevOps2.8k190 次安装24 周前更新
代码仓库

关于 docker-best-practices

供开发者创建和审查 Docker 镜像及 Compose 配置的参考技能,重点涉及构建阶段划分、镜像效率、运行安全和密钥处理。

主要功能

  1. 01多阶段构建
  2. 02Docker Compose 配置
  3. 03.dockerignore 指引
  4. 04镜像大小与层分析
  5. 05运行时安全检查清单

适用场景

  1. 01分离构建产物与运行时文件
  2. 02缩小构建上下文并减少镜像层
  3. 03检查容器用户和基础镜像设置
  4. 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