Dockerfile
Docker イメージのビルド手順を記述するテキストファイルで、アプリケーションの実行環境を再現可能にする
Dockerコンテナ
Dockerfile とは
Dockerfile は、Docker イメージのビルド手順を記述するテキストファイルである。ベースイメージの選択、依存パッケージのインストール、アプリケーションのコピー、起動コマンドを宣言的に定義し、docker build で再現可能なイメージを作成する。
基本構造
FROM node:22-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "dist/index.js"]
マルチステージビルド
ビルド環境と実行環境を分離し、最終イメージのサイズを削減する。
# ビルドステージ
FROM node:22-slim AS builder
WORKDIR /app
COPY package*.json tsconfig.json ./
RUN npm ci
COPY src/ src/
RUN npm run build
# 実行ステージ
FROM node:22-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]
| ステージ | 含まれるもの | サイズ |
|---|---|---|
| builder | TypeScript, devDependencies, ソースコード | 大きい |
| 最終イメージ | JS ファイル, 本番依存のみ | 小さい |
レイヤーキャッシュの最適化
Docker は各命令をレイヤーとしてキャッシュする。変更頻度の低いものを先に配置する。
# ✅ 依存関係を先にインストール (変更頻度が低い)
COPY package*.json ./
RUN npm ci
# ソースコードは後 (変更頻度が高い)
COPY . .
# ❌ COPY . . を先にすると、ソース変更のたびに npm ci が再実行される
COPY . .
RUN npm ci
セキュリティ
# ✅ 非 root ユーザーで実行
RUN addgroup --system app && adduser --system --ingroup app app
USER app
# ✅ .dockerignore で不要ファイルを除外
# .dockerignore:
# node_modules
# .git
# .env
よくある間違い
latestタグのみ使用 → バージョンが追跡できない。Git SHA やセマンティックバージョンを使う- root ユーザーで実行 → コンテナエスケープ時のリスクが高い
.dockerignoreがない →node_modulesや.gitがイメージに含まれる
Dockerfile のベストプラクティス
マルチステージビルドでビルド環境と実行環境を分離し、.dockerignore で不要なファイルを除外する。ベースイメージは alpine や distroless などの軽量なものを選び、変更頻度の低い命令を先に書いてレイヤーキャッシュを活用する。セキュリティ向上のため非 root ユーザーで実行する。
現場での応用を知るには関連書籍も役立つ。