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ツール開発に関する詳細な記事や実装事例を公開中です。