コンテンツにスキップ

Dockerfile 基本

Dockerfile は、コンテナイメージの作り方をコードで書くためのファイル。

「どのベースイメージを使うか」「何をコピーするか」「起動時に何を実行するか」を定義する。

どういう場面で使うか

  • アプリの実行環境をコード化したいとき
  • 開発環境と実行環境の差を減らしたいとき
  • CI で同じイメージを毎回再現したいとき
  • 配布可能な形でアプリをまとめたいとき
FROM python:3.12-slim AS base
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "main.py"]

まず押さえたいこと

  • Dockerfile は「手順書」ではあるが、最終的にはイメージを再現性高く作るための定義
  • ベースイメージ選びでサイズやセキュリティがかなり変わる
  • COPYRUN の順序でビルド速度が変わる
  • 最終イメージに不要なものを入れない意識が重要

まず見るポイント

  • マルチステージでビルド時依存を最終イメージに含めない
  • COPY の順序でキャッシュ最適化
  • ルートレス/ユーザ指定、不要なパッケージ削減
  • ベースイメージはできるだけ小さく、用途に合ったものを使う
  • .dockerignore で不要ファイルを送らない

よく使う命令

  • FROM: ベースイメージ指定
  • WORKDIR: 作業ディレクトリ
  • COPY: ファイルコピー
  • RUN: ビルド時にコマンド実行
  • ENV: 環境変数
  • EXPOSE: 利用ポートのメモ的宣言
  • CMD: デフォルト起動コマンド

よくある見方

  • FROM で何ベースかを見る
  • RUN で何を追加しているかを見る
  • COPY でどこまでイメージに含めているかを見る
  • CMD で起動時に何が動くかを見る

イメージレイヤーの簡易図

以下は Docker 公式ドキュメントの説明をもとにした簡易図。

+---------------------------+
| App source code           | <- COPY .
+---------------------------+
| App dependencies          | <- RUN pip install ...
+---------------------------+
| requirements.txt          | <- COPY requirements.txt
+---------------------------+
| Python runtime            | <- python:3.12-slim
+---------------------------+
| Base OS layer             |
+---------------------------+

メモ:

  • 各命令がレイヤーとして積み上がるイメージで見るとわかりやすい
  • 上の層だけ変われば、下の層のキャッシュを再利用しやすい

出典:

個人的な注意点

  • latest 固定は避け、なるべくタグを明示したい
  • 依存ファイルだけ先に COPY するとキャッシュが効きやすい
  • 機密情報を Dockerfile に直接書かない
  • 開発用と本番用でイメージ戦略を分けることがある

メモ

  • Dockerfile は「動けばよい」より「再現性があるか」「余計なものが入っていないか」で見る
  • サイズ、ビルド時間、脆弱性混入のしやすさはだいたいトレードオフになる
  • ローカルで動いた Dockerfile がそのまま CI/CD の土台になることが多い