Dify 框架连接 PGSQL 数据库与 Sandbox 环境下的 Linux 系统调用权限标题 ...

打印 上一主题 下一主题

主题 964|帖子 964|积分 2892

Dify 框架连接 PGSQL 数据库与 Sandbox 环境下的 Linux 系统调用权限标题

配景

在使用 Dify 框架举行开发时,遇到了两个主要的技术挑衅:

  • 代码节点连接到 PGSQL(PostgreSQL)数据库
  • 办理沙盒环境中由于系统调用限定导致的“operation not permitted”错误
本文档将详细描述怎样办理这两个标题,并介绍 psycopg2-binary Python 依赖的作用及其设置方法。同时,我们将强调设置文件修改后正确重启服务的重要性。
技术办理方案

PGSQL 数据库连接

为了使基于 Python 的 Dify 应用可以或许与 PostgreSQL 数据库通信,我们在 volumes\sandbox\dependencies\python-requirements.txt 文件中添加了 psycopg2-binary==2.9.10 依赖。该库提供了一个 PostgreSQL 数据库适配器,它包罗了预编译的二进制文件,简化了安装过程,避免了需要单独编译 C 扩展的标题。
  1. # volumes/sandbox/dependencies/python-requirements.txt
  2. psycopg2-binary==2.9.10
复制代码
当 Docker Compose 构建服务时,它会读取此文件并安装列出的全部 Python 包,包括 psycopg2-binary,从而为应用步调提供与 PGSQL 数据库交互的能力。安装完成后,通过代码节点设置应用中的数据库连接参数(如主机、端口、用户名、密码等),实现了代码节点与 PGSQL 数据库的成功连接。
Sandbox 中的 Linux 系统调用权限标题

在尝试运行代码节点时,遇到了如下错误信息:
  1. error: operation not permitted
复制代码
此错误表明应用步调尝试执行的利用被利用系统或沙盒环境所禁止。经分析,确定这是由于沙盒环境中对特定 Linux 系统调用的访问权限不足造成的。
为了办理这个标题,采取了以下步骤:


  • 调解沙盒策略:在 volumes\sandbox\conf\config.yaml 文件中扩展了 allowed_syscalls 列表,以答应必要的系统调用。这确保了沙盒内的应用步调可以执行所需的底层利用系统功能,而不会遇到权限错误。
下面是一个简化的 config.yaml 设置示例,其中列出了部分关键系统调用编号,表示这些利用是被答应的:
  1. allowed_syscalls:
  2.   # 基础文件操作
  3.   - 0   # read - 从文件描述符读取数据
  4.   - 1   # write - 向文件描述符写入数据
  5.   - 2   # open - 打开文件
  6.   - 3   # close - 关闭文件描述符
  7.   - 4   # stat - 获取文件状态
  8.   - 5   # fstat - 获取文件描述符状态
  9.   - 6   # lstat - 获取符号链接状态
  10.   - 7   # poll - 等待文件描述符上的事件
  11.   - 8   # lseek - 重新定位读/写文件偏移量
  12.   - 9   # mmap - 将文件或设备映射到内存
  13.   - 10  # mprotect - 设置内存区域的保护
  14.   - 11  # munmap - 取消内存映射
  15.   - 12  # brk - 改变数据段大小
  16.   # 系统操作
  17.   - 13  # rt_sigaction - 检查或修改信号处理
  18.   - 14  # rt_sigprocmask - 检查或修改阻塞信号
  19.   - 15  # rt_sigreturn - 从信号处理程序返回
  20.   - 16  # ioctl - 控制设备
  21.   - 17  # pread64 - 从指定偏移量读取
  22.   - 18  # pwrite64 - 向指定偏移量写入
  23.   - 19  # readv - 从文件描述符读取数据到多个缓冲区
  24.   - 20  # writev - 从多个缓冲区写入数据到文件描述符
  25.   - 21  # access - 检查文件访问权限
  26.   - 22  # pipe - 创建管道
  27.   - 23  # select - 同步 I/O 多路复用
  28.   - 24  # sched_yield - 让出处理器
  29.   - 25  # mremap - 重新映射虚拟内存地址
  30.   # 高级内存管理
  31.   - 26  # msync - 同步内存与物理存储
  32.   - 27  # mincore - 确定内存页是否驻留在内存中
  33.   - 28  # madvise - 给出内存使用建议
  34.   - 29  # shmget - 获取共享内存段
  35.   - 30  # shmat - 附加共享内存段
  36.   - 31  # shmctl - 共享内存控制
  37.   - 32  # dup - 复制文件描述符
  38.   - 33  # dup2 - 复制文件描述符到指定编号
  39.   - 34  # pause - 挂起进程直到收到信号
  40.   # 进程管理
  41.   - 35  # nanosleep - 高精度睡眠
  42.   - 36  # getitimer - 获取定时器值
  43.   - 37  # alarm - 设置定时器
  44.   - 38  # setitimer - 设置定时器
  45.   - 39  # getpid - 获取进程ID
  46.   - 40  # sendfile - 在文件描述符之间传输数据
  47.   # 网络操作
  48.   - 41  # socket - 创建套接字
  49.   - 42  # connect - 初始化套接字连接
  50.   - 43  # accept - 接受套接字连接
  51.   - 44  # sendto - 通过套接字发送消息
  52.   - 45  # recvfrom - 从套接字接收消息
  53.   - 46  # sendmsg - 通过套接字发送消息
  54.   - 47  # recvmsg - 通过套接字接收消息
  55.   - 48  # shutdown - 关闭套接字连接
  56.   - 49  # bind - 绑定套接字到地址
  57.   - 50  # listen - 监听套接字连接
  58.   # 进程间通信
  59.   - 51  # getsockname - 获取套接字本地地址
  60.   - 52  # getpeername - 获取套接字对端地址
  61.   - 53  # socketpair - 创建一对已连接的套接字
  62.   - 54  # setsockopt - 设置套接字选项
  63.   - 55  # getsockopt - 获取套接字选项
  64.   # 进程控制
  65.   - 56  # clone - 创建子进程
  66.   - 57  # fork - 创建进程
  67.   - 58  # vfork - 创建进程并阻塞父进程
  68.   - 59  # execve - 执行程序
  69.   - 60  # exit - 终止进程
  70.   - 61  # wait4 - 等待进程改变状态
  71.   - 62  # kill - 发送信号
  72.   # 信号处理
  73.   - 63  # uname - 获取系统信息
  74.   - 64  # semget - 获取信号量集
  75.   - 65  # semop - 信号量操作
  76.   - 66  # semctl - 信号量控制
  77.   - 67  # shmdt - 分离共享内存段
  78.   - 68  # msgget - 获取消息队列
  79.   - 69  # msgsnd - 发送消息到队列
  80.   - 70  # msgrcv - 从队列接收消息
  81.   - 71  # msgctl - 消息队列控制
  82.   # 文件系统操作
  83.   - 72  # fcntl - 文件描述符控制
  84.   - 73  # flock - 应用或删除文件锁
  85.   - 74  # fsync - 同步文件到存储设备
  86.   - 75  # fdatasync - 同步文件数据
  87.   - 76  # truncate - 截断文件
  88.   - 77  # ftruncate - 截断文件描述符指向的文件
  89.   - 78  # getdents - 获取目录项
  90.   - 79  # getcwd - 获取当前工作目录
  91.   - 80  # chdir - 改变当前工作目录
  92.   # 文件系统管理
  93.   - 81  # fchdir - 通过文件描述符改变当前工作目录
  94.   - 82  # rename - 重命名文件
  95.   - 83  # mkdir - 创建目录
  96.   - 84  # rmdir - 删除目录
  97.   - 85  # creat - 创建新文件
  98.   - 86  # link - 创建硬链接
  99.   - 87  # unlink - 删除文件名
  100.   - 88  # symlink - 创建符号链接
  101.   - 89  # readlink - 读取符号链接的值
  102.   - 90  # chmod - 改变文件权限
  103.   # 权限和所有权
  104.   - 91  # fchmod - 改变文件描述符的权限
  105.   - 92  # chown - 改变文件所有者和组
  106.   - 93  # fchown - 改变文件描述符指向文件的所有者和组
  107.   - 94  # lchown - 改变符号链接的所有者和组
  108.   - 95  # umask - 设置文件模式创建掩码
  109.   # 系统信息和统计
  110.   - 96  # gettimeofday - 获取时间和日期
  111.   - 97  # getrlimit - 获取资源限制
  112.   - 98  # getrusage - 获取资源使用情况
  113.   - 99  # sysinfo - 获取系统统计信息
  114.   - 100 # times - 获取进程时间
  115.   # 系统控制
  116.   - 101 # ptrace - 进程跟踪
  117.   - 102 # getuid - 获取用户ID
  118.   - 103 # syslog - 读取或清除内核消息
  119.   - 104 # getgid - 获取组ID
  120.   - 105 # setuid - 设置用户ID
  121.   - 106 # setgid - 设置组ID
  122.   # 用户和组管理
  123.   - 107 # geteuid - 获取有效用户ID
  124.   - 108 # getegid - 获取有效组ID
  125.   - 109 # setpgid - 设置进程组
  126.   - 110 # getppid - 获取父进程ID
  127.   - 111 # getpgrp - 获取进程组ID
  128.   # 会话管理
  129.   - 112 # setsid - 创建会话并设置进程组ID
  130.   - 113 # setreuid - 设置实际和有效用户ID
  131.   - 114 # setregid - 设置实际和有效组ID
  132.   - 115 # getgroups - 获取附加组ID
  133.   - 116 # setgroups - 设置附加组ID
  134.   # 系统资源管理
  135.   - 117 # setresuid - 设置实际、有效和保存的用户ID
  136.   - 118 # getresuid - 获取实际、有效和保存的用户ID
  137.   - 119 # setresgid - 设置实际、有效和保存的组ID
  138.   - 120 # getresgid - 获取实际、有效和保存的组ID
  139.   # 系统时间管理
  140.   - 121 # getpgid - 获取进程组ID
  141.   - 122 # setfsuid - 设置文件系统用户ID
  142.   - 123 # setfsgid - 设置文件系统组ID
  143.   - 124 # getsid - 获取会话ID
  144.   - 125 # capget - 获取进程权能
  145.   - 126 # capset - 设置进程权能
  146.   # 实时调度
  147.   - 127 # rt_sigpending - 检查待处理信号
  148.   - 128 # rt_sigtimedwait - 同步等待信号
  149.   - 129 # rt_sigqueueinfo - 排队一个信号和数据
  150.   - 130 # rt_sigsuspend - 等待信号
  151.   # 高级进程管理
  152.   - 131 # sigaltstack - 设置和获取信号栈上下文
  153.   - 132 # utime - 改变文件的访问和修改时间
  154.   - 133 # mknod - 创建特殊文件
  155.   - 134 # uselib - 加载共享库
  156.   - 135 # personality - 设置进程执行域
  157.   # 系统调用
  158.   - 136 # ustat - 获取文件系统统计信息
  159.   - 137 # statfs - 获取文件系统信息
  160.   - 138 # fstatfs - 获取文件系统信息
  161.   - 139 # sysfs - 获取文件系统类型信息
  162.   - 140 # getpriority - 获取程序调度优先级
  163.   # 进程优先级
  164.   - 141 # setpriority - 设置程序调度优先级
  165.   - 142 # sched_setparam - 设置调度参数
  166.   - 143 # sched_getparam - 获取调度参数
  167.   - 144 # sched_setscheduler - 设置调度策略和参数
  168.   - 145 # sched_getscheduler - 获取调度策略
  169.   # 调度策略
  170.   - 146 # sched_get_priority_max - 获取静态优先级上限
  171.   - 147 # sched_get_priority_min - 获取静态优先级下限
  172.   - 148 # sched_rr_get_interval - 获取时间片
  173.   - 149 # mlock - 锁定内存页
  174.   - 150 # munlock - 解锁内存页
  175.   # 内存锁定
  176.   - 151 # mlockall - 锁定进程的地址空间
  177.   - 152 # munlockall - 解锁进程的地址空间
  178.   - 153 # vhangup - 虚拟挂起终端
  179.   - 154 # modify_ldt - 读取或写入本地描述符表
  180.   - 155 # pivot_root - 改变根文件系统
  181.   # 系统引导
  182.   - 156 # _sysctl - 读取/写入系统参数
  183.   - 157 # prctl - 操作进程或线程
  184.   - 158 # arch_prctl - 设置架构特定的线程状态
  185.   - 159 # adjtimex - 调整系统时钟
  186.   # 文件系统控制
  187.   - 161 # chroot - 改变根目录
  188.   - 162 # sync - 同步文件系统缓冲区
  189.   - 163 # acct - 切换进程记账
  190.   - 164 # settimeofday - 设置时间和日期
  191.   - 165 # mount - 挂载文件系统
  192.   # 系统维护
  193.   - 166 # umount2 - 卸载文件系统
  194.   - 167 # swapon - 开启交换设备和文件
  195.   - 168 # swapoff - 关闭交换设备和文件
  196.   - 169 # reboot - 重新启动系统
  197.   - 170 # sethostname - 设置系统主机名
  198.   # 网络配置
  199.   - 171 # setdomainname - 设置系统域名
  200.   - 172 # iopl - 改变I/O权限级别
  201.   - 173 # ioperm - 设置端口I/O权限
  202.   - 174 # create_module - 创建可加载的模块项
  203.   - 175 # init_module - 初始化内核模块
  204.   # 内核模块
  205.   - 176 # delete_module - 删除内核模块
  206.   - 177 # get_kernel_syms - 检索导出的内核符号
  207.   - 178 # query_module - 查询内核模块信息
  208.   - 179 # quotactl - 操作文件系统配额
  209.   - 180 # nfsservctl - NFS服务器控制
  210.   # 系统信息查询
  211.   - 181 # getpmsg - 接收控制消息
  212.   - 182 # putpmsg - 发送控制消息
  213.   - 183 # afs_syscall - 未实现的系统调用
  214.   - 184 # tuxcall - 未实现的系统调用
  215.   - 185 # security - 未实现的系统调用
  216.   # 新增系统调用
  217.   - 186 # gettid - 获取线程标识符
  218.   - 187 # readahead - 预读文件到页面缓存
  219.   - 188 # setxattr - 设置扩展属性
  220.   - 189 # lsetxattr - 设置符号链接的扩展属性
  221.   - 190 # fsetxattr - 设置文件描述符的扩展属性
  222.   # 扩展属性操作
  223.   - 191 # getxattr - 获取扩展属性
  224.   - 192 # lgetxattr - 获取符号链接的扩展属性
  225.   - 193 # fgetxattr - 获取文件描述符的扩展属性
  226.   - 194 # listxattr - 列出扩展属性
  227.   - 195 # llistxattr - 列出符号链接的扩展属性
  228.   # 高级文件系统特性
  229.   - 196 # flistxattr - 列出文件描述符的扩展属性
  230.   - 197 # removexattr - 删除扩展属性
  231.   - 198 # lremovexattr - 删除符号链接的扩展属性
  232.   - 199 # fremovexattr - 删除文件描述符的扩展属性
  233.   - 200 # tkill - 发送信号到线程
  234.   # 时间管理
  235.   - 201 # time - 获取时间
  236.   - 202 # futex - 快速用户空间锁定
  237.   - 203 # sched_setaffinity - 设置进程的CPU亲和性掩码
  238.   - 204 # sched_getaffinity - 获取进程的CPU亲和性掩码
  239.   - 205 # set_thread_area - 设置线程本地存储
  240.   # 进程/线程控制
  241.   - 206 # io_setup - 创建异步I/O上下文
  242.   - 207 # io_destroy - 销毁异步I/O上下文
  243.   - 208 # io_getevents - 从完成队列读取异步I/O事件
  244.   - 209 # io_submit - 提交异步I/O块
  245.   - 210 # io_cancel - 取消异步I/O操作
  246.   # 异步I/O
  247.   - 211 # get_thread_area - 获取线程本地存储
  248.   - 212 # lookup_dcookie - 获取目录cookie的路径
  249.   - 213 # epoll_create - 创建epoll实例
  250.   - 214 # epoll_ctl_old - 旧的epoll控制接口
  251.   - 215 # epoll_wait_old - 旧的epoll等待接口
  252.   # 事件通知
  253.   - 216 # remap_file_pages - 创建非线性文件映射
  254.   - 217 # getdents64 - 获取目录项(64位版本)
  255.   - 218 # set_tid_address - 设置清除子线程ID的地址
  256.   - 219 # restart_syscall - 重启被中断的系统调用
  257.   - 220 # semtimedop - 带超时的信号量操作
  258.   # 定时器和时钟
  259.   - 221 # fadvise64 - 预声明访问模式
  260.   - 222 # timer_create - 创建POSIX定时器
  261.   - 223 # timer_settime - 设置定时器的时间
  262.   - 224 # timer_gettime - 获取定时器的时间
  263.   - 225 # timer_getoverrun - 获取定时器超限次数
  264.   # POSIX定时器
  265.   - 226 # timer_delete - 删除POSIX定时器
  266.   - 227 # clock_settime - 设置指定时钟的时间
  267.   - 228 # clock_gettime - 获取指定时钟的时间
  268.   - 229 # clock_getres - 获取时钟精度
  269.   - 230 # clock_nanosleep - 高精度睡眠
  270.   # 进程终止
  271.   - 231 # exit_group - 终止所有线程
  272.   - 232 # epoll_wait - 等待epoll事件
  273.   - 233 # epoll_ctl - 控制epoll实例
  274.   - 234 # tgkill - 发送信号到线程
  275.   - 235 # utimes - 更改文件访问和修改时间
  276.   # 虚拟内存操作
  277.   - 236 # vserver - Linux-VServer操作
  278.   - 237 # mbind - 设置内存策略
  279.   - 238 # set_mempolicy - 设置NUMA内存策略
  280.   - 239 # get_mempolicy - 检索NUMA内存策略
  281.   - 240 # mq_open - 打开消息队列
  282.   # POSIX消息队列
  283.   - 241 # mq_unlink - 删除消息队列
  284.   - 242 # mq_timedsend - 发送消息到队列
  285.   - 243 # mq_timedreceive - 从队列接收消息
  286.   - 244 # mq_notify - 注册消息队列通知
  287.   - 245 # mq_getsetattr - 获取/设置消息队列属性
  288.   # 密钥管理
  289.   - 246 # kexec_load - 加载新内核
  290.   - 247 # waitid - 等待进程状态改变
  291.   - 248 # add_key - 添加密钥到内核密钥管理系统
  292.   - 249 # request_key - 请求操作密钥
  293.   - 250 # keyctl - 密钥管理控制
  294.   # 输入输出多路复用
  295.   - 251 # ioprio_set - 设置I/O调度优先级
  296.   - 252 # ioprio_get - 获取I/O调度优先级
  297.   - 253 # inotify_init - 初始化inotify实例
  298.   - 254 # inotify_add_watch - 添加inotify监视
  299.   - 255 # inotify_rm_watch - 删除inotify监视
  300.   # 文件系统监控
  301.   - 256 # migrate_pages - 在NUMA系统中迁移进程页
  302.   - 257 # openat - 相对路径打开文件
  303.   - 258 # mkdirat - 相对路径创建目录
  304.   - 259 # mknodat - 相对路径创建特殊文件
  305.   - 260 # fchownat - 相对路径改变所有权
  306.   # 相对路径操作
  307.   - 261 # futimesat - 相对路径更改时间戳
  308.   - 262 # newfstatat - 相对路径获取文件状态
  309.   - 263 # unlinkat - 相对路径删除文件
  310.   - 264 # renameat - 相对路径重命名
  311.   - 265 # linkat - 相对路径创建硬链接
  312.   # 符号链接操作
  313.   - 266 # symlinkat - 相对路径创建符号链接
  314.   - 267 # readlinkat - 相对路径读取符号链接
  315.   - 268 # fchmodat - 相对路径改变权限
  316.   - 269 # faccessat - 相对路径检查访问权限
  317.   - 270 # pselect6 - 改进的select系统调用
  318.   # 高级I/O操作
  319.   - 271 # ppoll - 改进的poll系统调用
  320.   - 272 # unshare - 解除共享命名空间
  321.   - 273 # set_robust_list - 设置健壮的futex列表
  322.   - 274 # get_robust_list - 获取健壮的futex列表
  323.   - 275 # splice - 在文件描述符之间移动数据
  324.   # 零拷贝操作
  325.   - 276 # tee - 复制管道数据
  326.   - 277 # sync_file_range - 同步文件段
  327.   - 278 # vmsplice - 在进程和内核之间传输数据
  328.   - 279 # move_pages - 在NUMA系统中移动页面
  329.   - 280 # utimensat - 相对路径更改文件时间戳
  330.   # 事件通知
  331.   - 281 # epoll_pwait - 等待epoll事件,可中断
  332.   - 282 # signalfd - 创建信号接收文件描述符
  333.   - 283 # timerfd_create - 创建定时器文件描述符
  334.   - 284 # eventfd - 创建事件通知文件描述符
  335.   - 285 # fallocate - 预分配文件空间
  336.   # 定时器操作
  337.   - 286 # timerfd_settime - 设置定时器文件描述符
  338.   - 287 # timerfd_gettime - 读取定时器文件描述符
  339.   - 288 # accept4 - 接受带标志的连接
  340.   - 289 # signalfd4 - 改进的signalfd
  341.   - 290 # eventfd2 - 改进的eventfd
  342.   # 文件系统操作
  343.   - 291 # epoll_create1 - 改进的epoll_create
  344.   - 292 # dup3 - 改进的dup2
  345.   - 293 # pipe2 - 改进的pipe
  346.   - 294 # inotify_init1 - 改进的inotify_init
  347.   - 295 # preadv - 向量化的pread
  348.   # 向量I/O操作
  349.   - 296 # pwritev - 向量化的pwrite
  350.   - 297 # rt_tgsigqueueinfo - 排队实时信号到线程组
  351.   - 298 # perf_event_open - 性能监控
  352.   - 299 # recvmmsg - 接收多个消息
  353.   - 300 # fanotify_init - 初始化fanotify
  354.   # 文件系统通知
  355.   - 301 # fanotify_mark - 管理fanotify标记
  356.   - 302 # prlimit64 - 获取/设置资源限制
  357.   - 303 # name_to_handle_at - 文件句柄操作
  358.   - 304 # open_by_handle_at - 通过文件句柄打开
  359.   - 305 # clock_adjtime - 调整系统时钟
  360.   # 同步操作
  361.   - 306 # syncfs - 同步文件系统
  362.   - 307 # sendmmsg - 发送多个消息
  363.   - 308 # setns - 设置命名空间
  364.   - 309 # getcpu - 获取CPU和NUMA节点
  365.   - 310 # process_vm_readv - 进程间读取数据
  366.   # 进程间通信
  367.   - 311 # process_vm_writev - 进程间写入数据
  368.   - 312 # kcmp - 内核比较两个进程
  369.   - 313 # finit_module - 从文件描述符加载内核模块
  370.   - 314 # sched_setattr - 设置调度属性
  371.   - 315 # sched_getattr - 获取调度属性
  372.   # 安全计算
  373.   - 316 # renameat2 - 扩展的重命名操作
  374.   - 317 # seccomp - 设置安全计算模式
  375.   - 318 # getrandom - 获取随机数
  376.   - 319 # memfd_create - 创建匿名文件
  377.   - 320 # kexec_file_load - 从文件加载新内核
  378.   # 命名空间操作
  379.   - 321 # bpf - 扩展的BPF系统调用
  380.   - 322 # execveat - 相对路径执行程序
  381.   - 323 # userfaultfd - 用户页错误处理
  382.   - 324 # membarrier - 发出内存屏障
  383.   - 325 # mlock2 - 改进的内存锁定
  384.   # 套接字操作
  385.   - 326 # copy_file_range - 复制文件范围
  386.   - 327 # preadv2 - 带标志的向量化pread
  387.   - 328 # pwritev2 - 带标志的向量化pwrite
  388.   - 329 # pkey_mprotect - 设置内存保护键
  389.   - 330 # pkey_alloc - 分配内存保护键
  390.   # 内存保护
  391.   - 331 # pkey_free - 释放内存保护键
  392.   - 332 # statx - 扩展的文件状态
  393.   - 333 # io_pgetevents - 获取异步I/O事件
  394.   - 334 # rseq - 重启序列
  395.   - 335 # pidfd_send_signal - 通过文件描述符发送信号
复制代码


  • 验证更改:在实施上述更改后,重新测试应用步调,确认错误已办理且应用步调可以正常工作,同时确保没有引入额外的安全风险。
修改 docker-compose.yaml 以挂载本地设置文件

默认情况下,Dify 大概不会主动挂载本地设置文件到容器中。为了确保我们的自界说设置文件(如 config.yaml)可以或许在容器内生效,我们需要修改 docker/docker-compose.yaml 文件,添加卷挂载选项,以便将本地设置目录挂载到容器内的相应位置。
在 docker/docker-compose.yaml 文件中找到 sandbox 服务的部分,并添加以下行来挂载本地设置文件:
yaml深色版本
  1. services:
  2.   sandbox:
  3.     # 其他配置...
  4.     volumes:
  5.       - ./volumes/sandbox/conf:/conf  # 添加这一行以挂载本地配置文件
  6.       - ./volumes/sandbox/dependencies:/dependencies  # 如果有其他依赖项也需要挂载
  7.     # 其他配置...
复制代码
这样做的利益是可以直接在本地编辑设置文件,而不需要每次都进入容器内部举行修改,进步了开发和调试效率。
结果

通过上述措施,成功办理了应用步调连接 PGSQL 数据库的标题,并克服了沙盒环境下系统调用权限不足的障碍。终极,代码节点可以或许在保留安全性的同时正确地与外部资源交互。
留意事项

设置文件修改完成后,确保正确重启 Dify 服务以应用更改非常重要。为了保证新的设置生效,必须使用 docker compose stop 和 docker compose up -d 命令来重启 Dify。这是由于这些命令会确保 Docker Compose 重新读取并应用最新的设置文件更改。
正确的重启步骤


  • 制止当前运行的服务:使用 docker compose stop 命令来制止全部由 Docker Compose 启动的服务。这一步确保全部容器都制止运行,以便可以重新创建和启动它们。
    1. docker compose stop
    复制代码
  • 重新启动服务:使用 docker compose up -d 命令来配景启动服务。这个命令会根据最新的 docker-compose.yml 文件以及其他关联的设置文件(如 python-requirements.txt 和 config.yaml)重新创建和启动容器。
    1. docker compose up -d
    复制代码
不推荐的重启方法



  • 通过可视化工具(如 Podman 的界面)来重启:这种方式大概不会触发 Docker Compose 重新加载设置文件,因此大概导致新设置不被应用。别的,不同工具的实现细节大概会有所不同,不能保证它们会按照预期处理设置更新。
确认设置更新

在完成上述重启步骤后,建议查抄日志输出或直接测试应用步调的功能,以确认新的设置已经成功应用。可以通过以下命令检察服务的日志:
  1. docker compose logs -f
复制代码
这样可以及时监控服务启动过程中的输出,并验证是否遇到任何标题。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表