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 は「手順書」ではあるが、最終的にはイメージを再現性高く作るための定義
- ベースイメージ選びでサイズやセキュリティがかなり変わる
COPYやRUNの順序でビルド速度が変わる- 最終イメージに不要なものを入れない意識が重要
まず見るポイント¶
- マルチステージでビルド時依存を最終イメージに含めない
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 |
+---------------------------+
メモ:
- 各命令がレイヤーとして積み上がるイメージで見るとわかりやすい
- 上の層だけ変われば、下の層のキャッシュを再利用しやすい
出典:
- Docker Docs, Understanding the image layers https://docs.docker.com/get-started/docker-concepts/building-images/understanding-image-layers/
個人的な注意点¶
latest固定は避け、なるべくタグを明示したい- 依存ファイルだけ先に
COPYするとキャッシュが効きやすい - 機密情報を Dockerfile に直接書かない
- 開発用と本番用でイメージ戦略を分けることがある
メモ¶
- Dockerfile は「動けばよい」より「再現性があるか」「余計なものが入っていないか」で見る
- サイズ、ビルド時間、脆弱性混入のしやすさはだいたいトレードオフになる
- ローカルで動いた Dockerfile がそのまま CI/CD の土台になることが多い