Dockerfileベストプラクティス

効率的なDockerfileのベストプラクティス:レイヤー順序、キャッシング、.dockerignore、非rootユーザー、ヘルスチェック、セキュリティ強化。

Build

詳細な説明

Dockerfileベストプラクティス

1. 特定のベースイメージタグを使用

# 悪い例: 予測不可能
FROM node:latest

# 良い例: バージョン固定
FROM node:20.11-alpine3.19

2. 変更頻度でレイヤーを並べる

キャッシュヒットを最大化するため、変更頻度の低い命令を先に配置:

FROM node:20-alpine
WORKDIR /app

# これらは変更頻度が低い - キャッシュされる
COPY package.json package-lock.json ./
RUN npm ci --production

# これは変更頻度が高い - ここから再ビルド
COPY . .

3. レイヤー数を最小化

関連コマンドを単一のRUNにまとめる:

# 悪い例: 3レイヤー
RUN apt-get update
RUN apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/*

# 良い例: 1レイヤー
RUN apt-get update && \
    apt-get install -y --no-install-recommends curl && \
    rm -rf /var/lib/apt/lists/*

4. .dockerignoreを使用

node_modules
.git
.env
*.md
dist
.DS_Store

5. 非rootで実行

RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

6. ヘルスチェックを追加

HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1

7. ADDの代わりにCOPYを使用

# 単純なファイルコピーにはCOPYを優先
COPY ./config /app/config

# tar展開にのみADDを使用
ADD archive.tar.gz /opt/

8. 適切なラベルを設定

LABEL org.opencontainers.image.source="https://github.com/org/repo"
LABEL org.opencontainers.image.version="1.0.0"
LABEL org.opencontainers.image.description="My application"

ユースケース

より速くビルドでき、より小さなイメージを生成し、セキュリティベストプラクティスに従い、チームが保守しやすい本番グレードのDockerfileの作成。

試してみる — Docker CLI Reference

フルツールを開く