🌾

Rye+Docker環境におけるバインドマウントによる.venv消失対策

2024/04/28に公開

はじめに

Pythonには様々な仮想環境構築ツールやパッケージ管理ツールが存在しますが、その中で昨今最も注目を集めているRyeというツールがあります。

https://rye-up.com/

これまで私はDockerコンテナ内においてPoetryを利用して開発環境を構築してきましたが、この度Ryeに乗り換えてみることにしました。引き続きDockerも使用します。

Rye導入にあたって躓いたこと

仮想環境(virtualenv)作成を無効にできない

Ryeでは実行時にワーキングディレクトリに.venvディレクトリが作成されます。ローカルで環境構築をする際は環境の区分がハッキリして良いのですが、今回のようなDockerを用いる際は、Dockerによる仮想環境(コンテナ)内で更に仮想環境(.venv)を構築することになり二度手間に感じます。

しかしRyeでは仮想環境作成無効化はサポートされていません。また.venvディレクトリの移動も意図的にできないようになっています[1]

なおpoetryでは以下のコマンドで仮想環境作成を無効化できました。

poetry config --local virtualenvs.in-project true

バインドマウントを行うと.venvが消失する

私はcompose.yamlにて以下のようなバインドマウントを実施するようにしています

compose.yaml
services:
  dev:
    build:
      context: .
    volumes:
      - type: bind
        source: $PWD
        target: /workspace

ただしこのように設定しコンテナを起動すると、Dockerビルド時にせっかく作成した.venvディレクトリが丸ごと消えてしまいます。

解決策

結論、volume trickを実施すれば良いです[2]

volume trickとは「バインドマウントするフォルダ内にマウントさせたくないフォルダが存在する場合に、そのフォルダをマウント対象外にする方法[3]」です。
具体的にはcompose.yamlを以下のように記載すればよいです。

compose.yaml
services:
  dev:
    build:
      context: .
    volumes:
     - type: bind
        source: $PWD
        target: /workspace
+     - type: volume
+       source: venv
+       target: /workspace/.venv
+ volumes:
+   venv:

気になる点

今回消化した方法で複数リポジトリを作成すると、その分dockerボリュームを作成することになります。数が多くなれば何かしら不都合が発生する可能性があります...

脚注
  1. https://rye-up.com/guide/faq/#why-does-rye-contain-trojan-bearfoos ↩︎

  2. https://zenn.dev/yumemi_inc/articles/3d327557af3554 ↩︎

  3. https://jdlm.info/articles/2019/09/06/lessons-building-node-app-docker.html ↩︎

Discussion