Python


ここに示す例は、Python アプリケーションを Docker Hardened イメージに移行する方法を示すものです。

以下の例では Docker Hardened イメージへの移行前後における Dockerfile を示します。 例は 4 種類あります。

  • 移行前 (Wolfi): サンプルの Dockerfile は Wolfi ディストリビューションイメージを用いているものであり、DHI への移行前のものです。
  • 移行前 (DOI): サンプルの Dockerfile Docker 公式イメージを用いているものであり、DHI への移行前のものです。
  • 移行後 (マルチステージ): サンプルの Dockerfile を DHI へ移行した後のものであり、マルチステージビルドとしています (最小でセキュアなイメージとして推奨されます)。
  • 移行後 (シングルステージ): サンプルの Dockerfile を DHI へ移行した後のものであり、シングルステージビルドとしています (より単純なものですが、イメージサイズは大きくなり、攻撃対象領域も大きくなります)。
メモ

マルチステージビルドは、たいていのユースケースに対して推奨されます。 シングルステージビルドは、単純であるためにサポートされていますが、サイズやセキュリティとのトレードオフを考慮することが必要です。

Docker Hardened イメージをプルするにあたっては、あらかじめ dhi.io への認証を行っておく必要があります。 認証をするには docker login dhi.io を実行します。

#syntax=docker/dockerfile:1

FROM cgr.dev/chainguard/python:latest-dev AS builder

ENV LANG=C.UTF-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

WORKDIR /app

RUN python -m venv /app/venv
COPY requirements.txt .

# パッケージの追加を必要とする場合は apk を使ってインストールすること
# RUN apk add --no-cache gcc musl-dev

RUN pip install --no-cache-dir -r requirements.txt

FROM cgr.dev/chainguard/python:latest

WORKDIR /app

ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

COPY app.py ./
COPY --from=builder /app/venv /app/venv

ENTRYPOINT [ "python", "/app/app.py" ]
#syntax=docker/dockerfile:1

FROM python:latest AS builder

ENV LANG=C.UTF-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

WORKDIR /app

RUN python -m venv /app/venv
COPY requirements.txt .

# パッケージの追加を必要とする場合は apt を使ってインストールすること
# RUN apt-get update && apt-get install -y gcc && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir -r requirements.txt

FROM python:latest

WORKDIR /app

ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

COPY app.py ./
COPY --from=builder /app/venv /app/venv

ENTRYPOINT [ "python", "/app/app.py" ]
#syntax=docker/dockerfile:1

# === ビルドステージ: 依存パッケージのインストールと仮想環境生成 ===
FROM dhi.io/python:3.13-alpine3.21-dev AS builder

ENV LANG=C.UTF-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

WORKDIR /app

RUN python -m venv /app/venv
COPY requirements.txt .

# パッケージの追加を必要とする場合は apk を使ってインストールすること
# RUN apk add --no-cache gcc musl-dev

RUN pip install --no-cache-dir -r requirements.txt

# === 最終ステージ: 最小ランタイムイメージの生成 ===
FROM dhi.io/python:3.13-alpine3.21

WORKDIR /app

ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

COPY app.py ./
COPY --from=builder /app/venv /app/venv

ENTRYPOINT [ "python", "/app/app.py" ]
#syntax=docker/dockerfile:1

FROM dhi.io/python:3.13-alpine3.21-dev

ENV LANG=C.UTF-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

WORKDIR /app

RUN python -m venv /app/venv
COPY requirements.txt .

# パッケージの追加を必要とする場合は apk を使ってインストールすること
# RUN apk add --no-cache gcc musl-dev

RUN pip install --no-cache-dir -r requirements.txt

COPY app.py ./

ENTRYPOINT [ "python", "/app/app.py" ]