DifyのOSS版でpandasやnumpyが動かない問題を完全解決。アップデート耐性のあるDockerマウント方式で、好きなPythonライブラリを追加する方法を詳しく解説。syscallエラーの対処法も。
あの日、pandas が動かなかった
金曜の午後3時。「ちょっとデータ分析をワークフローに組み込んでみるか」と軽い気持ちで Dify のコードブロックに import pandas
と打ち込んだ瞬間、真っ赤なエラーが画面を覆った。
ModuleNotFoundError: No module named 'pandas'
「え、pandas も入ってないの?」
そこから始まった3日間の格闘の末、ようやく辿り着いた アップデート耐性もある完璧な解決策。今日はその全てをお見せしよう。
Dify Sandbox の仕組みを理解する
まず大前提として、Dify のコードブロックは DifySandbox という独立したセキュアな実行環境で動いている。2024年9月にリリースされた v0.7.1 から「好きな Python パッケージをインストールできる」ようになったが、実はこれが曲者だった。
Sandbox は Seccomp(Linux のシステムコール制限機構)を使ってセキュリティを担保しているため、ライブラリによっては追加の設定が必要になる
つまり、ただファイルに書けばいいわけじゃない。そこが罠だった。
方法1: シンプルだけど問題アリ(非推奨)
最初に試したのは、公式ドキュメント通りの方法:
# docker/volumes/sandbox/dependencies/python-requirements.txt に追加
pandas==2.2.2
numpy==1.26.5
そして再起動:
docker compose restart sandbox
結果:動いた!
...と思ったら、1週間後の git pull
でファイルが消えた。そう、この方法には致命的な欠陥がある。
- Dify をアップデートすると設定が消える
- volumes ディレクトリ内のファイルは Git 管理外
- チーム開発で設定を共有しづらい
方法2: アップデート耐性のあるマウント方式(推奨)
そこで編み出したのが、外部ディレクトリからのマウント方式だ。
Step 1: 外部設定ディレクトリを作成
sudo mkdir -p /opt/dify-config
sudo chown $USER:$USER /opt/dify-config
Step 2: ライブラリリストを外部に配置
cat > /opt/dify-config/python-requirements.txt <<'EOF'
pandas==2.2.2
numpy==1.26.5
scikit-learn==1.5.0
matplotlib==3.9.0
requests==2.32.3
EOF
Step 3: docker-compose.override.yml を作成
これが最重要ポイント。docker-compose.yml
は触らず、同じディレクトリに docker-compose.override.yml
を作成する:
version: "3.8"
services:
sandbox:
volumes:
- /opt/dify-config/python-requirements.txt:/app/dependencies/python-requirements.txt:ro
:ro
は読み取り専用マウント。セキュリティ的にも推奨。
Step 4: 再起動して反映
docker compose down
docker compose up -d --build sandbox
ログで pip install の実行を確認:
docker compose logs -f sandbox | grep -i "installing"
pandas が動かない!syscall エラーの解決
ここで新たな問題が発生。pandas や numpy を import すると:
Operation not permitted
これは Sandbox のセキュリティ機構によるもの。特定のシステムコールがブロックされているためだ。
解決策: config.yaml の調整
まず現在の設定をコピー:
cp docker/volumes/sandbox/conf/config.yaml /opt/dify-config/config.yaml
そして編集:
python_path: /usr/local/bin/python3
allowed_syscalls:
- 0
- 1
- 3
- 5
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 24
- 28
- 35
- 39
- 60
- 63
- 105
- 106
- 131
- 186
- 202
- 204
- 217
- 231
- 233
- 234
- 237
- 257
- 262
- 273
- 281
- 291
- 318
- 334
- 435 # numpy/pandas で必要
そして docker-compose.override.yml に追加:
version: "3.8"
services:
sandbox:
volumes:
- /opt/dify-config/python-requirements.txt:/app/dependencies/python-requirements.txt:ro
- /opt/dify-config/config.yaml:/app/conf/config.yaml:ro
実際に動作確認してみる
Dify のワークフローでコードブロックを作成し、以下を実行:
def main():
import sys
import pandas as pd
import numpy as np
print(f"Python: {sys.version}")
print(f"pandas: {pd.__version__}")
print(f"numpy: {np.__version__}")
# 実際にデータ処理してみる
df = pd.DataFrame({
'A': np.random.randn(5),
'B': np.random.randn(5)
})
print("\nDataFrame:")
print(df)
print(f"\n平均値: A={df['A'].mean():.2f}, B={df['B'].mean():.2f}")
# Difyでは通常、辞書形式で結果を返す
return {
"python_version": sys.version,
"pandas_version": pd.__version__,
"numpy_version": np.__version__,
"dataframe": df.to_dict(),
"mean_A": float(df['A'].mean()),
"mean_B": float(df['B'].mean())
}
結果:完璧に動作!
トラブルシューティング集
Q: ライブラリをインストールしたのに認識されない
A: コンテナ内で確認してみよう:
docker compose exec sandbox python3 -c "import pandas; print(pandas.__version__)"
エラーが出る場合は、再ビルドを試す:
docker compose up -d --build sandbox
Q: 「Operation not permitted」エラーが消えない
A: 必要なシステムコールを特定する方法:
# strace でシステムコールを調査
docker compose exec sandbox strace -c python3 -c "import pandas"
出力された syscall 番号を config.yaml の allowed_syscalls に追加。
Q: 開発環境では全権限で動かしたい
A: 開発環境限定で、config.yaml に以下を設定:
allowed_syscalls: "*" # 開発環境のみ!本番では絶対NG
パフォーマンス計測してみた
標準的な pandas 処理のベンチマーク結果:
- 初回起動時のインポート時間: 約2.3秒
- 2回目以降: 約0.8秒
- 100万行のDataFrame処理: 約1.5秒
Docker コンテナ毎回生成方式と比べて 10倍以上高速。これが DifySandbox の強みだ。
この方法のメリット
-
アップデート耐性:
git pull
しても設定が消えない - チーム開発対応: 設定ファイルを Git 管理できる
- 環境別設定: 開発/本番で異なる設定を使い分け可能
- ロールバック簡単: 外部ファイルを変更するだけ
まとめ:3日間の格闘で得た教訓
Dify の Sandbox にライブラリを追加するのは、実は思ったより奥が深い。単にファイルに書けばいいわけじゃなく、セキュリティとの兼ね合い、アップデート耐性、チーム開発への配慮など、考慮すべき点が多い。
でも、一度この仕組みを理解してしまえば、pandas でも scikit-learn でも、何でも動かせる最強の AI ワークフロー環境が手に入る。
もし「うまく動かない!」って人がいたら、まずは syscall の設定を疑ってみてほしい。大抵はそこが原因だから。
🌟 お知らせ
この記事が役に立ったら、ぜひフォローやいいねをお願いします!
🐦 X: @nabe_AI_dev
AI開発の最新情報や技術Tips、開発の進捗などを定期的にツイートしています。
📝 ブログ: AI Developer Blog
AIツール開発に関する詳細な記事や実装事例を公開中です。