👏
PythonアプリケーションのDockerパッケージ化
PythonアプリケーションをDocker パッケージ化するのに、依存するモジュールも入れておく必要がある。pythonは、pip install単体でなく、petryやuvでモジュールいれるのがベストプラクティスとなっている。
Pythonのモジュール依存関係管理するには
Pythonのモジュール管理するツールに、Poetry、uvがあります
いずれも、pythonは、pyenvなどで入れておく必要があります。
Poetry
uv
Rustで書かれたPython モジュール管理するになります。poetryより高速でpoetryからマイグレーションすることも対応している。
PytnonアプリケーションのDocker化
Dockerfileで必要なモジュールをpip installしないといけない。
RUN pip install -r requirements.txt
Poetryやuvからrequirement.txtをエクスポートすることもできるがスマートではない。
docker buildでuv sync
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