🕶️
uv で poetry の virtualenvs.create false と同じことをする
背景
今話題の Python のパッケージマネジャーの uv
高速でいいですよね。
poetry
を Dockerfile の中で使っている時は virtualenvs.create false
の設定をして .venv
ディレクトリを作らず直接仮想環境でない Python の環境にインストールしていたのですが、 uv
のドキュメントを見ても同じような設定が見つからずできないのかな?と色々調べたら同じようなことをする方法を見つけたのでまとめておきます。
方法
同じことが issue で質問されていて最終的にこうすればいいよと示されていました。
最初に見つけた issue
上記の issue の末尾からも飛べますが解決方法が記載されている issue
記載されていた 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
でドキュメントを検索したら簡単ですが説明もありました。
試してみた
せっかくなので上記の 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