イメージを指定したい(FROM)
1FROM イメージ:タグ
FROMでベースとして使うイメージ名を指定します。
イメージ名とタグはDocker Hubなどの
コンテナレジストリから探します。
タグに具体的なバージョンを指定することで、コンテナ環境の安定性を確保できます。
指定しない場合はlatestになります。
注釈
latestタグは常に最新版を指し、予告なく更新される可能性があります。
そのため予期しない動作変更が発生するリスクがあります。
本番環境では、必ず具体的なバージョンタグ(例:python:3.12.0)を指定することをお勧めします。
Pythonしたい
FROM python:3.12-slim
Docker Hubにある Pythonの公式レジストリ から必要なタグを指定します。
bookwormやbullseyeがついたタグでDebianのバージョンを指定できます。
slimがついたタグは、不要なライブラリが省かれた軽量版です。
alpineがついたタグはAlpine Linuxベースの超軽量版です。
BusyBoxしたい
1FROM busybox
BusyBoxは、一般的なLinuxコマンドを統合した超軽量イメージです。 イメージサイズが数MBと非常に小さいため、シンプルなコンテナやスクリプト実行に適しています。 フルOSが不要な場合や、イメージサイズを最小化したい場合に活用されます。
プラットフォームしたい(--platform)
1# x86 64bit
2# よくあるパソコン
3FROM --platform=linux/amd64 python:3.12
4
5# arm 64bit
6# Appleシリコン、Raspberry PI
7FROM --platform=linux/arm64 python:3.12
--platformオプションで、コンテナが動作するプラットフォームを変更できます。
デフォルトはホストPCと同じプラットフォームです。
マルチステージしたい
1# ビルド用ステージ
2FROM python:3.12-alpine as builder
3WORKDIR /build
4COPY pyproject.toml poetry.lock ./
5RUN pip install poetry && poetry install --no-dev
6
7# 実行用ステージ
8FROM python:3.12-alpine
9WORKDIR /app
10COPY --from=builder /build/.venv /app/.venv
11COPY src/ ./src/
12ENV PATH="/app/.venv/bin:$PATH"
13CMD ["python", "src/main.py"]
複数のFROMを使うことで、ビルドのステップを複数のステージに分割できます。
ビルド用ステージで依存パッケージをインストールしてから、実行用ステージで必要なファイルだけをコピーすることで、最終的なイメージサイズを削減できます。
上記のサンプルでは、
ビルド用ステージbuilder(builder)で、ビルド環境を準備し、Poetryで依存パッケージをインストールし、
実行用ステージで、builderステージから
.venv をコピーして、
必要なファイルだけを含めています。
このようにすることで、最終イメージにはビルドツールが含まれず、サイズも小さく、セキュリティリスクも低くなります。
as キーワード
マルチステージビルドで複数のFROMを使う際、as ステージ名でステージに名前を付けます。
後のCOPY --from=ステージ名で、指定したステージのファイルをコピーできます。
FROM scratch
1FROM scratch
2COPY app /app
3CMD ["/app"]
FROM scratchは、最小限のベースイメージから始める指定です。
空のイメージから開始するため、バイナリファイルのみのコンテナを作成でき、最小限のセキュリティ脅威面積を実現できます。
ただし、デバッグやシェルアクセスがないため、単純な実行ファイルのみのコンテナ向けです。