環境情報:
-
システム: Windows 11 + WSL2 (Ubuntu 22.04)
-
デプロイ: Docker Compose ソースコードによるデプロイ
-
要件: Sandbox 内で数理最適化コードを実行(
networkxおよびpulp+ システムレベルのソルバーglpk/cbcが必要)。
問題の説明: カスタムの Sandbox イメージを作成し、docker-compose.yml を修正しましたが、奇妙な「エラーループ」に陥っており、「依存関係が存在する」と「権限が十分である」の両方を同時に満たすことができません。
核心的な矛盾(The Loop):
-
状態 A:エラー “ModuleNotFoundError”
-
ライブラリが存在するようイメージを再構築しようとすると、Web インターフェースで「ライブラリが見つからない」というエラーが表示されます。
-
ただし、コンテナ内に
docker execで入って確認すると、ライブラリは存在しています。
-
-
状態 B:エラー “error: operation not permitted”
-
PuLP ソルバーの権限問題を解決するため、
docker-compose.ymlでsecurity_opt: seccomp:unconfinedおよびprivileged: trueを設定しました。 -
権限が有効になった(またはサービスを再起動して設定をリフレッシュした)直後、エラーは “No module named ‘networkx’” に変わります。
-
もしライブラリが見つかるように設定しても、コードが
prob.solve()に到達すると再び “operation not permitted” に変わります。
-
私の設定:
1. Dockerfile.sandbox(以下)
FROM langgenius/dify-sandbox:latest
USER root
RUN apt-get update && apt-get install -y coinor-cbc glpk-utils
RUN pip install --no-cache-dir --default-timeout=1000 -i https://mirrors.aliyun.com/pypi/simple/ \
numpy \
pandas \
scipy
RUN pip install --no-cache-dir --default-timeout=1000 -i https://mirrors.aliyun.com/pypi/simple/ \
networkx \
pulp \
scikit-opt \
statsmodels \
scikit-learn \
scienceplots \
openpyxl
2. docker-compose.yml(権限を解放する設定)
sandbox:
image: my-math-sandbox:local
container_name: docker-sandbox-1
restart: always
privileged: true
security_opt:
- seccomp:unconfined
- apparmor:unconfined
cap_add:
- SYS_PTRACE
確認済みの事実:
-
イメージ構築は正常:
docker run --rm -it my-math-sandbox:local python3 -c "import pulp; print('ok')"でテストしたところ、ライブラリとソルバーは正常に動作します。 -
コンテナは実行中:
docker psで確認すると、sandbox は確かにmy-math-sandbox:localイメージを読み込んでいます。 -
Exec テストは成功: コンテナ実行中に
docker exec -it docker-sandbox-1 python3で手動でスクリプトを実行すると、完全に正常で、権限エラーもライブラリ欠損エラーも発生しません。
質問の核心: なぜ Dify Web インターフェース(Go Runner) でコードを実行する環境と、私が docker exec で入った環境がこれほど異なる挙動を示すのでしょうか?
-
Dify の Runner が Python プロセスを起動する際に、Docker Compose の
security_optを無視している可能性はありますか? -
あるいは、特権モードを有効にすると、Runner が異なるファイルシステムをマウントして、私の
pip installが無効になる可能性はありますか?
どうか、この問題の調査方向をご教示ください!このループに2日間悩まされています。