`/gradio_api/file=` may not work with docker

这个 403 报错通常发生在 Docker 部署 Gradio 且通过相对路径(如 /gradio_api/file=images/0.jpg )访问挂载卷中的文件时。优先排查服务器进程的工作目录(WORKDIR)与挂载路径的关系,并将所有手写引用改为绝对路径。

快速结论:这个 403 报错通常发生在 Docker 部署 Gradio 且通过相对路径(如 /gradio_api/file=images/0.jpg)访问挂载卷中的文件时。优先排查服务器进程的工作目录(WORKDIR)与挂载路径的关系,并将所有手写引用改为绝对路径。

适用环境:Gradio 5.8.0(在 main 分支 6.22.0 上仍可复现)、Linux 操作系统、Docker 容器部署。

最快修复方案:在 HTML 或前端代码中,将手写的相对 file= 路径改为绝对路径,例如 /gradio_api/file=/root_path/images/0.jpg,而不是 /gradio_api/file=images/0.jpg

注意事项:此方案仅适用于“手写引用”的场景。Gradio 本身生成的文件 URL 都是绝对路径(组件值会先复制到缓存),不会触发此问题。问题本质是服务器把相对路径解析到进程工作目录,而非挂载路径。

问题场景

用户在使用 Gradio 构建 Web 应用(MMKG-RAG)时,通过 Docker 部署并挂载卷到容器。启动命令中设置了 allowed_paths=["/root_path/"],但当通过手写的相对路径 /gradio_api/file=images/0.jpg 访问挂载卷中的图片时,返回 403 错误。在本地直接启动时,同样的路径可以正常访问。

报错原文

{"detail":"File not allowed: images/0.jpg."}

(本地访问时返回 200,容器内访问时报 403。)

原因分析

可能与 Docker 无关,真正的变量是服务器进程的工作目录(CWD)。Gradio 的 is_in_or_equal 函数(gradio/utils.py:1360)使用 abspath(path_1).resolve() 处理路径,因此相对请求路径会先相对于服务器的工作目录解析,而不是相对于 allowed_paths 中的条目。

例如,如果 Docker 的 WORKDIR/app,而卷挂载在 /root_path,那么 images/0.jpg 会被解析为 /app/images/0.jpg,超出 /root_path 的允许范围,导致 403。同样的应用在数据目录内启动(工作目录为 /tmp/rootpath)时,相对路径可以正确解析。

根据 Issue 讨论,Gradio 自身生成的 file= URL 都是绝对路径(组件值会先复制到缓存),因此普通使用不会触发此问题。会触发问题的是人手写的相对路径引用,其含义是“相对于数据根目录”,但服务器会将其解析到工作目录下。

环境排查

  • 确认 Gradio 版本(Issue 中为 5.8.0,main 分支 6.22.0 仍可复现)。
  • 检查 Docker 镜像中的 WORKDIR 设置。
  • 确认挂载卷的路径与 allowed_paths 配置的对应关系。
  • 确认应用启动时的工作目录(本地验证时 cd 到数据目录可复现 200,切换到其他目录可复现 403)。

解决步骤

  1. 在 HTML 或前端代码中,将所有手写的 /gradio_api/file=... 引用改成绝对路径,例如 /gradio_api/file=/root_path/images/0.jpg。这是 Issue 中确认为有效的修复方案。
  2. 如果需要保留相对路径的写法,可优先尝试将 allowed_paths 的值改为与服务器工作目录匹配的绝对路径,并配合调整 Docker 的 WORKDIR 或挂载方式。但此方案未经确认,且相对路径语义不明确,不建议依赖。
  3. 如果不想修改前端引用,可以考虑在应用启动时通过 os.chdir() 将进程工作目录切换到数据根目录(即挂载路径),但此方法未在 Issue 中验证,属于可能存在的替代方案。

验证方法

使用 curl 命令访问资源,确认返回 200 而不是 403:

curl "http://127.0.0.1:7860/gradio_api/file=/root_path/images/0.jpg"

在浏览器中直接访问该绝对路径,确认图片正常显示。

参考来源

gradio-app/gradio #10180

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 18297

发表回复

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