セルフホステッド(docker)でローカルに構築したDifyのワークフローのコードブロックにnumpyやduckduckgo-searchのようなサードーパーティ製ライブラリを利用すると
Error: Operation not permitted
のようなエラーが出る問題についての解決策。
対応
-
Docker Composeファイルの修正
ホスト上の
./docker/docker-compose.yaml
ファイルをテキストエディタで開き、サンドボックスで許可するシステムコールをホストの環境変数とマッピングする。services: sandbox: environment: ALLOWED_SYSCALLS: ${SANDBOX_ALLOWED_SYSCALLS:-}
-
許可するsyscallsの設定
ホストのコンソールで以下のコマンドを実行し、サンドボックスで許可するシステムコール番号を環境変数として登録する。
(永続化したい場合は必要に応じて~/.bashrc
等に登録してください。)この設定はDifyサンドボックスで全てのシステムコール番号(0〜500)を許可します。
コンテナの隔離性が失われることで悪意あるコードが特権操作を実行可能になるなど、ホストのセキュリティも著しく低下することになるため、ローカル環境以外では絶対に利用しないでください。システムコール番号はカーネルによって変わる可能性があります。
export SANDBOX_ALLOWED_SYSCALLS=$(seq -s, 0 500)
-
Pythonライブラリの登録
ホスト上の
./docker/volumes/sandbox/dependencies/python-requirements.txt
ファイルをテキストエディタで開き、Difyのコードブロックで使用したいライブラリ名を登録する。numpy duckduckgo-search
-
Difyの再起動
docker compose down && docker compose up -d
検証ワークフロー
テストワークフローは以下のとおり。
STARTに入力パラメータはなく、NUMPYとDUCKDUCKGOが返した値をそのままENDで出力しています(LLMは使っていません)。
コードブロック(NUMPY):
import numpy as np
def main() -> dict:
# NumPyで1から10までの配列の平均を計算して返す
arr = np.arange(1, 11)
avg = np.mean(arr)
return {
"result": avg,
}
コードブロック(DUCKDUCKGO):
from duckduckgo_search import DDGS
def main() -> dict:
# DuckDuckGoで検索した結果を返す
ddgs = DDGS()
results = list(ddgs.text('Difyとは?', region='jp-jp', max_results=1))
return {
"result": results[0]['body'] if results else None
}
ワークフロー実行結果
以下の通りNumpyの計算結果とDuckDuckGoのWEB検索結果を出力することができました。
参考ウェブサイトなど
以上です。