🌾
Rye+Docker環境におけるバインドマウントによる.venv消失対策
はじめに
Pythonには様々な仮想環境構築ツールやパッケージ管理ツールが存在しますが、その中で昨今最も注目を集めているRyeというツールがあります。
これまで私は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ボリュームを作成することになります。数が多くなれば何かしら不都合が発生する可能性があります...
Discussion