👏

PythonアプリケーションのDockerパッケージ化

2025/02/24に公開

PythonアプリケーションをDocker パッケージ化するのに、依存するモジュールも入れておく必要がある。pythonは、pip install単体でなく、petryやuvでモジュールいれるのがベストプラクティスとなっている。

Pythonのモジュール依存関係管理するには

Pythonのモジュール管理するツールに、Poetry、uvがあります
いずれも、pythonは、pyenvなどで入れておく必要があります。

Poetry

https://python-poetry.org/

uv

Rustで書かれたPython モジュール管理するになります。poetryより高速でpoetryからマイグレーションすることも対応している。

https://github.com/astral-sh/uv

PytnonアプリケーションのDocker化

Dockerfileで必要なモジュールをpip installしないといけない。

RUN pip install -r requirements.txt

Poetryやuvからrequirement.txtをエクスポートすることもできるがスマートではない。

docker buildでuv sync

Dockerfileのベストプラクティスでも書かれているのようです。

https://depot.dev/docs/container-builds/how-to-guides/optimal-dockerfiles/python-uv-dockerfile

上記でsyncしたあと最後にビルドするステージで、WORKDIRないとモジュールがみつからくうまくいかなかった。

uvコマンドを取得、uv sync、最後にアプリケーションをビルドするマルチステージビルドとなっています。

FROM python:3.12.7-slim-bookworm AS base

FROM base AS builder
COPY --from=ghcr.io/astral-sh/uv:0.4.9 /uv /bin/uv
ENV UV_COMPILE_BYTECODE=1 UV_LINK_NODE=copy

WORKDIR /app

COPY uv.lock pyproject.toml /app/
RUN --mount=type=cache,target=/root/.cache/uv \ 
   uv sync --frozen --no-install-project --no-dev

COPY . /app
RUN --mount=type=cache,target=/root/.cache/uv \ 
   uv sync --frozen --no-dev

FROM base
WORKDIR /app

COPY --from=builder /app /app
ENV PATH="/app/.venv/bin:$PATH"

EXPOSE 8000

# 実行コマンド指定
ENTRYPOINT ["gunicorn", "-w", "2", "-b", "0.0.0.0", "src.app:app"]

Discussion