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の作成。