Dockerfile
Docker イメージのビルド手順を記述するテキストファイルで、アプリケーションの実行環境を再現可能にする
Dockerfile とは
Dockerfile は、Docker イメージのビルド手順を記述するテキストファイルである。ベースイメージの選択、依存パッケージのインストール、アプリケーションのコピー、起動コマンドを宣言的に定義し、docker build で再現可能なイメージを作成する。
基本構造
Dockerfile は FROM でベースイメージを指定し、COPY や RUN でファイルの配置と依存関係のインストールを行い、CMD で起動コマンドを定義する。各命令がレイヤーとしてキャッシュされるため、変更頻度の低い命令を先に書くとビルドが高速化する。
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 ユーザーで実行することで、コンテナエスケープ時のセキュリティリスクを最小化する。また .dockerignore で .env や .git を除外し、機密情報やビルドに不要なファイルがイメージに含まれるのを防ぐ。
# ✅ 非 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 ユーザーで実行する。
現場での応用を知るには関連書籍も役立つ。
この記事は役に立ちましたか?
関連用語
コンテナ
アプリケーションとその依存関係をパッケージ化し、環境に依存しない一貫した実行環境を提供する仮想化技術
Init コンテナ
Kubernetes でメインコンテナの起動前に初期化処理を実行する特殊なコンテナ
ECR
AWS のマネージドコンテナレジストリで、Docker イメージを安全に保存・管理・配信する
Docker
アプリケーションをコンテナとしてパッケージ化し、どの環境でも同じように実行できるプラットフォーム
サプライチェーンセキュリティ
ソフトウェアの依存関係やビルドパイプラインを通じた攻撃を防ぐセキュリティ対策
イミュータブルインフラストラクチャ
サーバーを変更せず、新しいイメージで丸ごと置き換えるインフラ運用手法