问题修复记录:Dify Docker Sandbox 指定Pip源 与 代码运行无权限 问题

重磅推荐专栏:
《大模型AIGC》
《课程大纲》
《知识星球》

本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验分享,旨在帮助读者更好地理解和应用这些领域的最新进展

如何安装 Pip 包

在 volumes/sandbox/dependencies/python-requirements.txt 文件里面添加需要的包就行。sandbox容器启动后就会开始下载。

如何指定 Pip 源

sandbox容器启动后,会发现下载特别慢。这个时候我们就可以指定 Pip 源。

看 sandbox 源码:

https://github.com/langgenius/dify-sandbox/blob/0.2.10/internal/static/config.go

可以看到:
在这里插入图片描述
容器内是用 PIP_MIRROR_URL 环境变量指定源的。
在 dify 1.2.0 的 docker/.env.example 源码:

https://github.com/langgenius/dify/blob/main/docker/.env.example

也加了已经这个环境变量,可以按一下例子添加清华的源:
在这里插入图片描述
但是 docker/docker-compose.yaml 里面:

https://github.com/langgenius/dify/blob/main/docker/docker-compose.yaml

只在 plugin_daemon 容器中添加了:
在这里插入图片描述
但是在 sandbox 里面却没有:
在这里插入图片描述
这个bug 我已经官方提交 PR了:

https://github.com/langgenius/dify/pull/18371

在这里插入图片描述
在 sandbox 的环境变量里添加了 PIP_MIRROR_URL,容器启动后就会在指定的源下载Pip包了。

代码执行 报错:Run failed: error: operation not permitted

在 Dify 工作流中配置执行自定义ython 代码时报错,提示 Run failed: error: operation not permitted。

这是由于 Dify 使用 sandbox 沙盒化容器执行工作流代码时,采用白名单策略对容器内的系统调用进行了限制,只允许运行特定的系统调用,从而确保不会出现意外的绕过。

编辑 volumes/sandbox/conf/config.yaml 文件,修改 allowed_syscalls 配置。allowed_syscalls 配置说明如下:

# 基础文件操作
- 0   # read - 从文件描述符读取数据
- 1   # write - 向文件描述符写入数据
- 2   # open - 打开文件
- 3   # close - 关闭文件描述符
- 4   # stat - 获取文件状态
- 5   # fstat - 获取文件描述符状态
- 6   # lstat - 获取符号链接状态
- 7   # poll - 等待文件描述符上的事件
- 8   # lseek - 重新定位读/写文件偏移量
- 9   # mmap - 将文件或设备映射到内存
- 10  # mprotect - 设置内存区域的保护
- 11  # munmap - 取消内存映射
- 12  # brk - 改变数据段大小
# 系统操作
- 13  # rt_sigaction - 检查或修改信号处理
- 14  # rt_sigprocmask - 检查或修改阻塞信号
- 15  # rt_sigreturn - 从信号处理程序返回
- 16  # ioctl - 控制设备
- 17  # pread64 - 从指定偏移量读取
- 18  # pwrite64 - 向指定偏移量写入
- 19  # readv - 从文件描述符读取数据到多个缓冲区
- 20  # writev - 从多个缓冲区写入数据到文件描述符
- 21  # access - 检查文件访问权限
- 22  # pipe - 创建管道
- 23  # select - 同步 I/O 多路复用
- 24  # sched_yield - 让出处理器
- 25  # mremap - 重新映射虚拟内存地址
# 高级内存管理
- 26  # msync - 同步内存与物理存储
- 27  # mincore - 确定内存页是否驻留在内存中
- 28  # madvise - 给出内存使用建议
- 29  # shmget - 获取共享内存段
- 30  # shmat - 附加共享内存段
- 31  # shmctl - 共享内存控制
- 32  # dup - 复制文件描述符
- 33  # dup2 - 复制文件描述符到指定编号
- 34  # pause - 挂起进程直到收到信号
# 进程管理
- 35  # nanosleep - 高精度睡眠
- 36  # getitimer - 获取定时器值
- 37  # alarm - 设置定时器
- 38  # setitimer - 设置定时器
- 39  # getpid - 获取进程ID
- 40  # sendfile - 在文件描述符之间传输数据
# 网络操作
- 41  # socket - 创建套接字
- 42  # connect - 初始化套接字连接
- 43  # accept - 接受套接字连接
- 44  # sendto - 通过套接字发送消息
- 45  # recvfrom - 从套接字接收消息
- 46  # sendmsg - 通过套接字发送消息
- 47  # recvmsg - 通过套接字接收消息
- 48  # shutdown - 关闭套接字连接
- 49  # bind - 绑定套接字到地址
- 50  # listen - 监听套接字连接
# 进程间通信
- 51  # getsockname - 获取套接字本地地址
- 52  # getpeername - 获取套接字对端地址
- 53  # socketpair - 创建一对已连接的套接字
- 54  # setsockopt - 设置套接字选项
- 55  # getsockopt - 获取套接字选项
# 进程控制
- 56  # clone - 创建子进程
- 57  # fork - 创建进程
- 58  # vfork - 创建进程并阻塞父进程
- 59  # execve - 执行程序
- 60  # exit - 终止进程
- 61  # wait4 - 等待进程改变状态
- 62  # kill - 发送信号
# 信号处理
- 63  # uname - 获取系统信息
- 64  # semget - 获取信号量集
- 65  # semop - 信号量操作
- 66  # semctl - 信号量控制
- 67  # shmdt - 分离共享内存段
- 68  # msgget - 获取消息队列
- 69  # msgsnd - 发送消息到队列
- 70  # msgrcv - 从队列接收消息
- 71  # msgctl - 消息队列控制
# 文件系统操作
- 72  # fcntl - 文件描述符控制
- 73  # flock - 应用或删除文件锁
- 74  # fsync - 同步文件到存储设备
- 75  # fdatasync - 同步文件数据
- 76  # truncate - 截断文件
- 77  # ftruncate - 截断文件描述符指向的文件
- 78  # getdents - 获取目录项
- 79  # getcwd - 获取当前工作目录
- 80  # chdir - 改变当前工作目录
# 文件系统管理
- 81  # fchdir - 通过文件描述符改变当前工作目录
- 82  # rename - 重命名文件
- 83  # mkdir - 创建目录
- 84  # rmdir - 删除目录
- 85  # creat - 创建新文件
- 86  # link - 创建硬链接
- 87  # unlink - 删除文件名
- 88  # symlink - 创建符号链接
- 89  # readlink - 读取符号链接的值
- 90  # chmod - 改变文件权限
# 权限和所有权
- 91  # fchmod - 改变文件描述符的权限
- 92  # chown - 改变文件所有者和组
- 93  # fchown - 改变文件描述符指向文件的所有者和组
- 94  # lchown - 改变符号链接的所有者和组
- 95  # umask - 设置文件模式创建掩码
# 系统信息和统计
- 96  # gettimeofday - 获取时间和日期
- 97  # getrlimit - 获取资源限制
- 98  # getrusage - 获取资源使用情况
- 99  # sysinfo - 获取系统统计信息
- 100 # times - 获取进程时间
# 系统控制
- 101 # ptrace - 进程跟踪
- 102 # getuid - 获取用户ID
- 103 # syslog - 读取或清除内核消息
- 104 # getgid - 获取组ID
- 105 # setuid - 设置用户ID
- 106 # setgid - 设置组ID
# 用户和组管理
- 107 # geteuid - 获取有效用户ID
- 108 # getegid - 获取有效组ID
- 109 # setpgid - 设置进程组
- 110 # getppid - 获取父进程ID
- 111 # getpgrp - 获取进程组ID
# 会话管理
- 112 # setsid - 创建会话并设置进程组ID
- 113 # setreuid - 设置实际和有效用户ID
- 114 # setregid - 设置实际和有效组ID
- 115 # getgroups - 获取附加组ID
- 116 # setgroups - 设置附加组ID
# 系统资源管理
- 117 # setresuid - 设置实际、有效和保存的用户ID
- 118 # getresuid - 获取实际、有效和保存的用户ID
- 119 # setresgid - 设置实际、有效和保存的组ID
- 120 # getresgid - 获取实际、有效和保存的组ID
# 系统时间管理
- 121 # getpgid - 获取进程组ID
- 122 # setfsuid - 设置文件系统用户ID
- 123 # setfsgid - 设置文件系统组ID
- 124 # getsid - 获取会话ID
- 125 # capget - 获取进程权能
- 126 # capset - 设置进程权能
# 实时调度
- 127 # rt_sigpending - 检查待处理信号
- 128 # rt_sigtimedwait - 同步等待信号
- 129 # rt_sigqueueinfo - 排队一个信号和数据
- 130 # rt_sigsuspend - 等待信号
# 高级进程管理
- 131 # sigaltstack - 设置和获取信号栈上下文
- 132 # utime - 改变文件的访问和修改时间
- 133 # mknod - 创建特殊文件
- 134 # uselib - 加载共享库
- 135 # personality - 设置进程执行域
# 系统调用
- 136 # ustat - 获取文件系统统计信息
- 137 # statfs - 获取文件系统信息
- 138 # fstatfs - 获取文件系统信息
- 139 # sysfs - 获取文件系统类型信息
- 140 # getpriority - 获取程序调度优先级
# 进程优先级
- 141 # setpriority - 设置程序调度优先级
- 142 # sched_setparam - 设置调度参数
- 143 # sched_getparam - 获取调度参数
- 144 # sched_setscheduler - 设置调度策略和参数
- 145 # sched_getscheduler - 获取调度策略
# 调度策略
- 146 # sched_get_priority_max - 获取静态优先级上限
- 147 # sched_get_priority_min - 获取静态优先级下限
- 148 # sched_rr_get_interval - 获取时间片
- 149 # mlock - 锁定内存页
- 150 # munlock - 解锁内存页
# 内存锁定
- 151 # mlockall - 锁定进程的地址空间
- 152 # munlockall - 解锁进程的地址空间
- 153 # vhangup - 虚拟挂起终端
- 154 # modify_ldt - 读取或写入本地描述符表
- 155 # pivot_root - 改变根文件系统
# 系统引导
- 156 # _sysctl - 读取/写入系统参数
- 157 # prctl - 操作进程或线程
- 158 # arch_prctl - 设置架构特定的线程状态
- 159 # adjtimex - 调整系统时钟
# 文件系统控制
- 161 # chroot - 改变根目录
- 162 # sync - 同步文件系统缓冲区
- 163 # acct - 切换进程记账
- 164 # settimeofday - 设置时间和日期
- 165 # mount - 挂载文件系统
# 系统维护
- 166 # umount2 - 卸载文件系统
- 167 # swapon - 开启交换设备和文件
- 168 # swapoff - 关闭交换设备和文件
- 169 # reboot - 重新启动系统
- 170 # sethostname - 设置系统主机名
# 网络配置
- 171 # setdomainname - 设置系统域名
- 172 # iopl - 改变I/O权限级别
- 173 # ioperm - 设置端口I/O权限
- 174 # create_module - 创建可加载的模块项
- 175 # init_module - 初始化内核模块
# 内核模块
- 176 # delete_module - 删除内核模块
- 177 # get_kernel_syms - 检索导出的内核符号
- 178 # query_module - 查询内核模块信息
- 179 # quotactl - 操作文件系统配额
- 180 # nfsservctl - NFS服务器控制
# 系统信息查询
- 181 # getpmsg - 接收控制消息
- 182 # putpmsg - 发送控制消息
- 183 # afs_syscall - 未实现的系统调用
- 184 # tuxcall - 未实现的系统调用
- 185 # security - 未实现的系统调用
# 新增系统调用
- 186 # gettid - 获取线程标识符
- 187 # readahead - 预读文件到页面缓存
- 188 # setxattr - 设置扩展属性
- 189 # lsetxattr - 设置符号链接的扩展属性
- 190 # fsetxattr - 设置文件描述符的扩展属性
# 扩展属性操作
- 191 # getxattr - 获取扩展属性
- 192 # lgetxattr - 获取符号链接的扩展属性
- 193 # fgetxattr - 获取文件描述符的扩展属性
- 194 # listxattr - 列出扩展属性
- 195 # llistxattr - 列出符号链接的扩展属性
# 高级文件系统特性
- 196 # flistxattr - 列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小爷毛毛(卓寿杰)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值