イメージを指定したい(FROM

1FROM イメージ:タグ

FROMでベースとして使うイメージ名を指定します。 イメージ名とタグはDocker Hubなどの コンテナレジストリから探します。

タグに具体的なバージョンを指定することで、コンテナ環境の安定性を確保できます。 指定しない場合はlatestになります。

注釈

latestタグは常に最新版を指し、予告なく更新される可能性があります。 そのため予期しない動作変更が発生するリスクがあります。

本番環境では、必ず具体的なバージョンタグ(例:python:3.12.0)を指定することをお勧めします。

Pythonしたい

FROM python:3.12-slim

Docker Hubにある Pythonの公式レジストリ から必要なタグを指定します。

bookwormbullseyeがついたタグで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を使うことで、ビルドのステップを複数のステージに分割できます。

ビルド用ステージで依存パッケージをインストールしてから、実行用ステージで必要なファイルだけをコピーすることで、最終的なイメージサイズを削減できます。

上記のサンプルでは、 ビルド用ステージbuilderbuilder)で、ビルド環境を準備し、Poetryで依存パッケージをインストールし、 実行用ステージで、builderステージから .venv をコピーして、 必要なファイルだけを含めています。

このようにすることで、最終イメージにはビルドツールが含まれず、サイズも小さく、セキュリティリスクも低くなります。

as キーワード

マルチステージビルドで複数のFROMを使う際、as ステージ名でステージに名前を付けます。 後のCOPY --from=ステージ名で、指定したステージのファイルをコピーできます。

FROM scratch

1FROM scratch
2COPY app /app
3CMD ["/app"]

FROM scratchは、最小限のベースイメージから始める指定です。 空のイメージから開始するため、バイナリファイルのみのコンテナを作成でき、最小限のセキュリティ脅威面積を実現できます。 ただし、デバッグやシェルアクセスがないため、単純な実行ファイルのみのコンテナ向けです。

リファレンス