Dockerfile生成

Dockerfile
結果

Dockerfileは、詳細を思い出すまでは短く見えるファイルの一つです。レイヤー順はキャッシュに影響し、COPY package.jsonRUN npm installの前に置き、コンパイル言語ではマルチステージビルドが有利です。このジェネレーターは、選択したスタック向けに、キャッシュのパターンが最初から正しいすぐ使えるDockerfileを書き出します。

Dockerfileの生成手順

  1. 1

    スタックを選ぶ

    Node.js、Python、PHP、Go、Rustから選択します。各テンプレートは言語に合ったベースイメージと正しい依存関係インストールコマンドを使用します。

  2. 2

    作業ディレクトリとポートを設定

    WORKDIRとアプリが待ち受けるポートを選びます。どちらも生成ファイルに書き込まれます。

  3. 3

    Dockerfileを確認

    EXPOSE行と起動コマンドがアプリに合っているか確認してください。GoとRustのテンプレートはマルチステージビルドを使用します。

  4. 4

    Dockerfileをコピー

    結果をコピーしてリポジトリのルートに貼り付け、イメージをビルドします。

マルチステージビルドの利点

素朴なDockerfileはコンパイラのツールチェーン全体を最終イメージにインストールします。マルチステージビルドでは、コンパイルを行う「builder」ステージと、コンパイル済み成果物だけを載せる最終ステージに分けられます:

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

最終イメージからは開発依存関係、ソースファイル、ビルドキャッシュがすべて除かれ、イメージサイズが60〜80パーセント削減されることもよくあります。

ベースイメージの種類

テンプレートでは可能な限りslimまたはalpineイメージを使用します。ベースイメージを自分で調整する場合の主な選択肢は次のとおりです:

種類 一般的なサイズ 選ぶタイミング
full 300-900 MB 開発用イメージ、珍しいシステム依存関係
slim 80-200 MB ほとんどの言語で本番の標準
alpine 30-100 MB 小さなイメージ、glibcとmuslの違いに注意
distroless 20-80 MB 最大の安全性、シェルもパッケージマネージャーもなし

レイヤーキャッシュのルール

Dockerは各行をキャッシュします。レイヤーが変わると、それより下はすべて再ビルドされます。変更頻度の低い順に並べると:

  1. FROMのベースイメージ(めったに変わらない)。
  2. システムパッケージ(apt-get install)、変更はまれ。
  3. 依存関係マニフェスト(package.jsonrequirements.txtcomposer.json)。
  4. 依存関係のインストール手順。マニフェストが変わったときだけ実行される。
  5. ソースコードのコピー。最も頻繁に変わるレイヤーで、それ以降はコミットのたびに再ビルドされる。
  6. コンパイルと最終のCMD

この順序を崩すことが、CIビルドが遅くなる最も一般的な原因です。

セキュリティチェックリスト

  • 非rootで実行する。 末尾付近にUSER appuser(またはUSER 1000)を置く。
  • バージョンを固定する。 python:3.12.7-slimpython:3.12より良く、python:latestよりはるかに良い。
  • /に頼らず明示的なWORKDIRを設定する。
  • ローカルファイルにはADDではなくCOPYを使う。 ADDには自動展開の副作用がある。
  • HEALTHCHECKを追加してオーケストレーターが停止したプロセスを検出できるようにする。
  • パッケージキャッシュは同じRUN行で掃除する。 apt-get install ... && rm -rf /var/lib/apt/lists/*

よくある質問

slimは多くのライブラリのプリコンパイル済みwheelと同様にglibcベースのままなので、より安全な既定値です。alpineはmuslを使うため、Python(pandas、numpy)やNode(node-gypのネイティブモジュール)で不可解な実行時バグを起こすことがあります。イメージサイズが重要で、スタックをテスト済みならalpineを選んでください。

はい、プロジェクトに追加してください。無いとDockerはリポジトリ全体をビルドコンテキストとしてデーモンに送ります。git履歴、node_modules、ローカルの.envファイル、テストなどです。遅く、キャッシュを無駄にし、秘密情報が漏れます。

できます。docker buildx--platformオプション付きで使い、両方のアーキテクチャを一度にビルドしてください。テンプレートが使うベースイメージはarm64版も公開しています。

いいえ。選択したスタック、作業ディレクトリ、ポートはこのページでDockerfileを生成するためだけに使われ、保存も共有もされません。

関連ツール

このツールは他の言語でも利用できます