uvを使用したPython環境のdevcontainer

お疲れ様です。

引き続きDockerの勉強を進めています。
その中でPythonのパッケージ管理ツールのuvを使って環境設定するdevcontainerを作成しましたのでそれをご紹介。

uvについて

プログラミング言語Rustで作成された高速なPythonのパッケージ管理ツールです。

個人的に使用するメリットとしては以下が挙げられます。

  1. ライブラリのインストールが高速
  2. pyproject.tomlでプロジェクト管理

DockerでPythonのプロジェクトを作成するにあたりpipenvなどいろいろ試した結果、現状はこのuvが最も使いやすいという結論になりました。
インストール等の動作が高速なのは言わずもがな良いポイントですし、プロジェクト管理もPythonの公式が推奨しているpyproject.tomlをベースとして使用しているのも良いなと思いました。

作成

テンプレートとしてGitHubにも残しましたのでこれから気になる方はこちらをご確認ください。 github.com

{
    "name": "uv",
    "build": {
      "dockerfile": "../Dockerfile"
    },
    "settings": {
      "terminal.integrated.defaultProfile.linux": "bash"
    },
    "extensions": [
      "ms-python.python",
      "kevinrose.vsc-python-indent",
      "mhutchie.git-graph",
      "eamodio.gitlens"
    ],
    "forwardPorts": [8000],
    "remoteUser": "root",
    "runArgs": ["--gpus", "all"],
    "postCreateCommand": "uv sync --no-cache"
}
  • Dockerfile
# ベースイメージ(ここは自由に変更)
FROM ubuntu:latest

# 必要なソフトのインストール
RUN apt-get update && apt-get install -y \
    git \
    && rm -rf /var/lib/apt/lists/*

# uvのインストール
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/

# Default command
CMD ["/bin/bash"]

Dockerfileのベースイメージのところはcudaなど別のものに変更することが可能です。uvのインストールはuvのdockerイメージからコピーしています。 devcontainer.jsonの"postCreateCommand"で指定されたコマンドがDockerのイメージが作成された後の最後に実行されます。今回はuvの仮想環境を作成するuv sync --no-cacheを実行し、プロジェクト内に仮想環境.venvを作成しています。

使用方法

  1. このリポジトリをクローン お好きなフォルダで下記のコマンドを実行
    git clone https://github.com/muetaek0321/uv-devcontainer-template.git
    この時、事前に"pyproject.toml"等の設定ファイルを変更し、インストールするPythonバージョンやライブラリを指定することも可能です。

  2. リポジトリのフォルダをVSCodeから開き、Dev Containerを立ち上げ
    VSCode上から「コンテナで再度開く(Reopen in Container)
    プロジェクトのフォルダ内に仮想環境(.venv)が作成されます
    VSCode上では開いているフォルダに.venvがあればターミナル上で自動でアクティベートされた状態になります。

  3. 必要なライブラリをインストール インストール時は下記のコマンドを実行
    [package]はインストールしたいライブラリ名を入れてください。(numpy, pandasなど)
    uv add [package]
    uvのインストールコマンドはほかにuv pip install [package]がありますが、こちらはプロジェクト設定ファイルに依存関係の情報が記録されません。そのため上記コマンドを使用することを推奨します。

参考サイト

uvのコマンドなどの参考
uv (pythonパッケージマネージャー)の使い方 簡易版 #Python - Qiita