Local plugin installation fails with Permission Denied (os error 13) on .uv-cache

该报错通常出现在 Windows 11 + WSL2 上以 Docker 自托管 Dify、从本地安装插件时:uv 把缓存写到 bind-mounted 的 /app/storage/cwd/.uv-cache (即宿主机 Windows 文件系统),在 rename/写入缓存归档时触发 permi

快速结论:该报错通常出现在 Windows 11 + WSL2 上以 Docker 自托管 Dify、从本地安装插件时:uv 把缓存写到 bind-mounted 的 /app/storage/cwd/.uv-cache(即宿主机 Windows 文件系统),在 rename/写入缓存归档时触发 permission denied。优先排查 volumes/plugin_daemon 是否位于 Windows-backed 挂载,并考虑把 uv 缓存迁移到容器本地路径。

适用环境:Dify 自托管(Docker),镜像版本 langgenius/dify-api:1.17.1(commit 09d52fdf8248);uv 0.12.2(x86_64-unknown-linux-gnu);插件 dify-plugin 0.6.2 / 0.9.1;宿主系统 Windows 11 + WSL2;存储位于 Windows-backed 文件系统。

最快修复方案:暂无确认的一步修复方案。Issue 中的修复方向(设置 UV_CACHE_DIR=/tmp/.uv-cache 并让 plugin-daemon 读取该变量、在运行 uv 前创建目录)需要等待发布包含该改动的新 dify-plugin-daemon 镜像,单独设置环境变量在现有镜像上不会完全生效。

注意事项:上述修复属于 Issue 讨论中提出的方向,尚未在报告者环境中验证;在旧镜像上仅改 compose 环境变量不足以解决,需等对应 daemon 镜像发布。此外,把卷迁移到 Linux VM 内会改变现有 .uv-cache 的位置,可能需要迁移或清理说明。

问题场景

在 Windows 11 + WSL2 上通过 Docker 自托管 Dify,从本地存储安装插件(如 knowledgebase_update、Telegram trigger 等本地插件包)时,插件运行时在初始化环境、安装依赖阶段失败。插件启动日志显示 uv 在 /app/storage/cwd/.uv-cache 下写入或重命名缓存文件失败,导致插件无法启动。

报错原文

failed to launch plugin: failed to install dependencies: failed to install dependencies: exit status 1, output:
TRACE Querying interpreter executable at /app/storage/cwd/r3-yama...pp/storage/cwd/.uv-cache/archive-v0/hZHhpY4aKEuVpUxw: Permission
      denied (os error 13)
failed to init environment
  × Failed to download `gevent==26.5.0`
  ├─▶ Failed to read from the distribution cache
  ╰─▶ failed to rename file from /app/storage/cwd/.uv-cache/.tmprH7LXW to
      /app/storage/cwd/.uv-cache/archive-v0/dKnt3qnqidIf_yYO: Permission
      denied (os error 13)
failed to init environment

原因分析

根据 Issue 讨论,问题并非“Dify 无法安装插件”本身,而是 uv 把缓存写在 bind-mounted 的插件工作目录上:daemon 实际使用的是 /app/storage/cwd/.uv-cache,该路径位于 volumes/plugin_daemon 之下。在 WSL2 下,该卷位于 Windows-backed 文件系统,uv 在缓存中重命名临时文件时遇到 permission denied(os error 13),与日志现象一致。修复方向是让 uv 缓存不再使用该卷,改为放到容器本地路径(如 /tmp/.uv-cache)。

环境排查

  • 确认宿主系统与运行方式:是否为 Windows 11 + WSL2,Docker 是否运行在 WSL 内。
  • 确认 volumes/plugin_daemonvolumes/storage 实际所在的文件系统:是 Linux 原生 FS,还是 Windows-backed 挂载(如 C:\Users\user\dify\...)。
  • 确认 Dify 镜像/版本:报告中使用 langgenius/dify-api:1.17.1
  • 确认 uv 版本:日志中为 uv 0.12.2(x86_64-unknown-linux-gnu)。
  • 确认涉及的插件依赖:如 dify-plugin 0.6.2(依赖 requestsurllib3)、dify-plugin 0.9.1(依赖 gevent)。

解决步骤

  1. 先确认存储位置:检查 volumes/plugin_daemon 是否落在 Windows-backed 文件系统。报告者在 Issue 中确认其 volumes/storage 位于 C:\Users\user\dify\...(经 WSL2 访问),与权限异常一致。
  2. 在 compose 与 env 示例中为 plugin_daemon 传入 UV_CACHE_DIR=/tmp/.uv-cache(Issue 中提到的提供方式)。
  3. 等待并升级到包含相应改动的 dify-plugin-daemon 镜像:该镜像中 daemon 会读取 UV_CACHE_DIR(默认 /tmp/.uv-cache),而不是硬编码 PLUGIN_WORKING_PATH/.uv-cache,并在运行 uv 前创建该目录。
  4. 若暂时无法升级镜像,可优先尝试将 volumes/plugin_daemon(及相关存储卷)迁移到 WSL2 Linux VM 内的原生 Linux 文件系统,避开 Windows-backed 挂载的重命名/权限问题;此方向属于讨论中的排查思路,未在 Issue 中验证。

验证方法

在完成镜像升级(或迁移卷位置)后,重新从本地存储安装此前失败的插件,观察插件是否成功启动、依赖安装是否完成,日志中不再出现针对 .uv-cachePermission denied (os error 13)failed to init environment。若仍失败,可继续保留完整 uv 日志以便定位缓存路径是否已被正确切换。

参考来源

langgenius/dify #42433

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 24322

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注