🕶️

uv で poetry の virtualenvs.create false と同じことをする

2024/10/16に公開

背景

今話題の Python のパッケージマネジャーの uv 高速でいいですよね。

poetry を Dockerfile の中で使っている時は virtualenvs.create false の設定をして .venv ディレクトリを作らず直接仮想環境でない Python の環境にインストールしていたのですが、 uv のドキュメントを見ても同じような設定が見つからずできないのかな?と色々調べたら同じようなことをする方法を見つけたのでまとめておきます。

方法

同じことが issue で質問されていて最終的にこうすればいいよと示されていました。

最初に見つけた issue

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

上記の issue の末尾からも飛べますが解決方法が記載されている issue

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

記載されていた Dockerfile 例

FROM python:3.11.9-slim-bookworm

# Add my locally built binary
ADD uv /bin/uv
RUN chmod +x /bin/uv

# Create a project
RUN uv init example
WORKDIR example

# Use the system Python environment
ENV UV_PROJECT_ENVIRONMENT="/usr/local/"

# Add httpx to the project
RUN uv add httpx

# Import it using the system Python
RUN python -c "import httpx"

UV_PROJECT_ENVIRONMENT で Python が入っているディレクトリが /usr/local/bin であるとしたら一つ上の /usr/local を指定すればいいようです。

💡 なお間違って /usr/local/bin を指定してしまうと以下のエラーが出ました

root@6cbe1400439f:/tmp/example#  UV_PROJECT_ENVIRONMENT="/usr/local/bin"
root@6cbe1400439f:/tmp/example# uv add httpx
error: Project virtual environment directory `/usr/local/bin` cannot be used because because it is not a valid Python environment (no Python executable was found)

UV_PROJECT_ENVIRONMENT でドキュメントを検索したら簡単ですが説明もありました。

https://docs.astral.sh/uv/configuration/environment/#:~:text=install tool executables.-,UV_PROJECT_ENVIRONMENT,-%3A Use to specify

試してみた

せっかくなので上記の Dockerfile とまったく同じことをターミナルから試してみます。

> docker run --rm -it --platform linux/amd64 python:3.11.9-slim-bookworm /bin/bash

> cd /tmp
> apt update && apt install -y curl 
...skipping
> curl -LsSf https://astral.sh/uv/install.sh | sh
head: error reading '/proc/self/exe': Bad file descriptor
head: failed to close '/proc/self/exe': Bad file descriptor
ERROR: unknown platform bitness
sh: 1535: [: Illegal number: 
downloading uv 0.4.22 x86_64-unknown-linux-gnu
installing to /root/.cargo/bin
  uv
  uvx
everything's installed!

To add $HOME/.cargo/bin to your PATH, either restart your shell or run:

    source $HOME/.cargo/env (sh, bash, zsh)
    source $HOME/.cargo/env.fish (fish)
> source $HOME/.cargo/env
> uv init example
Initialized project `example` at `/tmp/example`
> cd example/
> export UV_PROJECT_ENVIRONMENT="/usr/local"
> pip freeze | grep ruff  # インストールされていないので何も表示しない
> uv add ruff  # ruff をインストールしてみる
Resolved 9 packages in 474ms
Prepared 1 package in 810ms
Installed 1 package in 12ms
 + ruff==0.6.9
> pip freeze | grep ruff
ruff==0.6.9  # インストールできた

これで Dockerfile でも uv が使えそうですね。
最初の issue の投稿からの迅速な対応はありがたいですね。 uv のアクティビティの高さに感謝です。

💡 まとめ

  • poetry の virtualenvs.create false 相当の設定方法を調べました
  • UV_PROJECT_ENVIRONMENT を使うことでプロジェクトの virtual environment を設定できます

Discussion