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 ユーザーで実行する。

現場での応用を知るには関連書籍も役立つ。

関連用語