1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dify OSS版で pandas が動かない?コードブロックにPythonライブラリを追加する完全ガイド

Posted at

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?