Carpe Diem

備忘録

VS CodeのPython環境をDev Containersで構築する

概要

PythonはGoと違ってライブラリのdeprecatedや破壊的変更が多いため、環境やライブラリバージョンの固定が非常に重要です。

  • Dev Containers
  • poetry
  • 仮想環境(venvなど、今回はpoetryのvirtualenv)

を使うことで、それらを固定してチーム内で安定した開発環境を構築できます。

環境

  • macOS 13.6
  • Dev Containers 0.346.0
  • python 3.11.8
  • poetry 1.7.1

役割

Dev Containersのアーキテクチャはこのようになっています。

ref: https://code.visualstudio.com/docs/devcontainers/containers

ソースコードをマウントし、実行環境だけコンテナ化することで開発環境を統一することができます。

役割をそれぞれ説明すると以下のようになります。

コンポーネント 役割
Dev Containers pythonのバージョンの固定、実行環境(OSなど)の統一
poetry パッケージ管理(バージョンロックなど)。仮想環境の用意も可能
仮想環境 パッケージの導入状態をプロジェクト毎に独立させる

仮想環境については「Dev Containersですでに仮想化されているので不要では?」とも思いますが、以下のメリットがあるので使った方が良いでしょう。

  • コンテナ内で複数のPythonプロジェクトを開発している場合、仮想環境を使ってプロジェクトごとに異なる依存関係を管理できる
  • Dev Containersを使用せずにローカル環境で作業する場合でも、同じ設定を容易に再現できる

構築方法

まずは拡張機能を↓からインストールしておきます。

marketplace.visualstudio.com

Dev Containersの導入

コマンドパレット(macOSならCmd+Shift+P)でdev containersと入力し、構成ファイルの追加を選択します。

次にワークスペースを選択。

次にPythonを選択。

Pythonのバージョンを選択します。
LLaMAなどは最新バージョンだと↓のように怒られるので、今回は3.11を選択します。

llama-index requires Python >=3.8.1,<3.12, so it will not be satisfied for Python >=3.12,<4.0.0

最後に追加パッケージとしてPoetryを選択します。注意としてチェックボックスをクリックしないと有効化されません。

devcontainer.json

すると.devcontainer/devcontainer.jsonというファイルが生成されます。
先程の手順で進めると↓のようになります。

// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/python
{
    "name": "Python 3",
    // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
    "image": "mcr.microsoft.com/devcontainers/python:1-3.11-bookworm",
    "features": {
        "ghcr.io/devcontainers-contrib/features/poetry:2": {}
    }

    // Features to add to the dev container. More info: https://containers.dev/features.
    // "features": {},

    // Use 'forwardPorts' to make a list of ports inside the container available locally.
    // "forwardPorts": [],

    // Use 'postCreateCommand' to run commands after the container is created.
    // "postCreateCommand": "pip3 install --user -r requirements.txt",

    // Configure tool-specific properties.
    // "customizations": {},

    // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
    // "remoteUser": "root"
}

次のように修正してPoetryのバージョンを固定します。

   "features": {
        "ghcr.io/devcontainers-contrib/features/poetry:2": {
            "version": "1.7.1"
        }
    }

設定が完了したらコマンドパレットから「コンテナで再度開く」 or 「コンテナをリビルド」します。

コンテナで再度開く場合

コンテナをリビルドする

以降は設定したディレクトリ(.devcontainer/devcontainer.jsonがあるディレクトリ)から開くと次のようにVS Codeがよろしく訊いてくれます。

動作確認

上部メニューからターミナルを作成します。

unameなどのコマンドを打つと設定した環境になっていることを確認できます。

Poetryの設定

先程のターミナルで

$ poetry init

を実行します。それ以降の設定は任意なので全てyesやEnterでもOKです。

するとpyproject.tomlが生成されます。

[tool.poetry]
name = "python-init"
version = "0.1.0"
description = ""
authors = ["Junpei Tsuji <xxx@gmail.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.11"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

readme = "README.md"

とあるように、README.mdがないと怒られるので用意しておきます。

$ touch README.md

仮想環境の設定

次のように打ち、ライブラリなどが今のディレクトリ直下の仮想環境で管理されるようにします。

$ poetry config virtualenvs.in-project true --local

次のようなpoetry.tomlが生成されます。

[virtualenvs]
in-project = true

以降は

$ poetry run xxx

とすれば、この仮想環境で実行してくれるようになります。

※最初にpoetry runを実行した際には.venvフォルダが生成されます。

ライブラリの追加

$ poetry add streamlit

などパッケージを追加すると、.venvに追加されていきます。

このように仮想環境によってパッケージの導入状態をプロジェクト毎に独立させることができます。

まとめ

VS CodePython環境をDev Containersで構築する手順を説明しました。