Open7
uvの公式Dockefileを読む
uvの公式Dockerfileには見覚えのない情報が多いので読み解いてみる
ENV UV_COMPILE_BYTECODE=1
Equivalent to the --compile-bytecode command-line argument. If set, uv will compile Python source files to bytecode after installation.
インストール後にpythonソースファイルをバイトコードにコンパイルする
ENV UV_LINK_MODE=copy
link-modeなるものの設定
Copy packages from the wheel into the site-packages directory
だそう。
# Install the project's dependencies using the lockfile and settings
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync --frozen --no-install-project --no-dev
RUN
コマンドの最初に--mount
を置くと、ビルド時にマウントを動かせる。
一行目はビルドキャッシュのマウント、2行目はuv.lockファイルのマウント、3行目はpyproject.tomlのマウント
4行目はuv sync
--frozen
はlockファイルをアップデートしない
--no-install-project
はプロジェクトファイルをインストールしない
--no-dev
はdev dependenciesをインストールしない
# Then, add the rest of the project source code and install it
# Installing separately from its dependencies allows optimal layer caching
ADD . /app
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --frozen --no-dev
projectファイルを追加する。
projectファイルをインストールする。
レイヤー分けのため依存ライブラリと分けてインストールする。
# Place executables in the environment at the front of the path
ENV PATH="/app/.venv/bin:$PATH"
インストールした依存をPATHの最初に追加する。
# Reset the entrypoint, don't invoke `uv`
ENTRYPOINT []
ENTRYPOINTを抹消する
# Run the FastAPI application by default
# Uses `fastapi dev` to enable hot-reloading when the `watch` sync occurs
# Uses `--host 0.0.0.0` to allow access from outside the container
CMD ["fastapi", "dev", "--host", "0.0.0.0", "src/uv_docker_example"]
fastapiを起動
他気になるオプション
-
--no-editable
- https://docs.astral.sh/uv/guides/integration/docker/#non-editable-installs
- non-editable modeでインストールする
- multi stage buildでvenvとはリンクしない形でインストールするらしい