目录

使用 Docker 部署 Label Studio 时本地文件无法显示的排查与解决

1. 背景

2. 问题现象

3. 排查步骤

3.1 确认文件是否存在

3.2 检查环境变量配置

4. 解决方案

方法一:修改 Sync Storage 路径(相对路径)

方法二:修改环境变量为 /

5. 最终解决

6. 总结

7. 建议


使用 Docker 部署 Label Studio 时本地文件无法显示的排查与解决

1. 背景

在生产环境中,我们常使用 Docker 部署 Label Studio 来进行数据标注。标注文件通常存储在一个挂载目录中,例如 /obs,并通过 同步存储(Sync Storage) 功能导入到项目中。

但在配置过程中遇到一个常见问题:图片无法显示,日志中报 404 错误


2. 问题现象

启动容器后访问项目页面,标注图片无法正常加载,日志出现以下报错:

[WARNING] Not Found: /data/local-files/
"GET /data/local-files/?d=obs/fish/%E5%9B%8A%E8%82%BF%E7%89%99%E9%B2%86%E9%B1%BC/img/1927190418391302144_20250527102953_1-1.jpg HTTP/1.1" 404 0

可以看到请求路径是:

/data/local-files/?d=obs/fish/囊肿牙鲆鱼/img/xxx.jpg

但返回了 404。


3. 排查步骤

3.1 确认文件是否存在

进入容器查看文件是否挂载成功:

docker exec -it label-studio bash
ls /obs/fish/囊肿牙鲆鱼/img/

文件存在,说明挂载没问题。

3.2 检查环境变量配置

启动脚本中配置了:

--env LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/obs

意味着 Label Studio 期望所有访问路径是相对于 /obs 的,例如:

/fish/囊肿牙鲆鱼/img/xxx.jpg

但实际 Sync Storage 路径是:

/obs/fish/囊肿牙鲆鱼/img/xxx.jpg

导致系统拼接后路径错误,变成:

/obs/obs/fish/囊肿牙鲆鱼/img/xxx.jpg

自然找不到文件。


4. 解决方案

方法一:修改 Sync Storage 路径(相对路径)

保持 LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/obs 不变,将路径改为相对路径:

/fish/囊肿牙鲆鱼/img/xxx.jpg

这样拼接后路径正确。

方法二:修改环境变量为 /

如果无法调整 Sync Storage 路径格式,可以直接让 Label Studio 以 / 作为本地文件根目录:

--env LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/

这样 d=obs/fish/... 会直接解析为 /obs/fish/...,无需改 Sync Storage 配置。


5. 最终解决

本案例中选择了方法二,即将环境变量改为 /

docker run -d \--name label-studio \-p 9002:8080 \-v /data1/apps/label-studio/data:/label-studio/data \-v /data1/apps/label-studio/files:/label-studio/files \-v /obs:/obs \--env LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED=true \--env LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/ \heartexlabs/label-studio:latest

修改后,图片路径 /obs/fish/... 可直接访问,标注页面图片正常显示。


6. 总结

问题原因:

  • LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT 定义了 Label Studio 允许访问的本地文件根目录;

  • d= 参数必须是该根目录下的相对路径;

  • 配置不一致会导致访问路径错误,返回 404。

解决方法:

  • 要么保持环境变量为 /obs,路径写相对路径;

  • 要么环境变量改为 /,路径保持原始 /obs/... 格式。


7. 建议

  • 生产环境中推荐明确设置 LOCAL_FILES_DOCUMENT_ROOT,避免随意改动文件路径结构;

  • 如果存在多个文件根目录,可统一挂载到 /label-studio/files 下,减少混乱;

  • 遇到 404 问题时,优先检查:

    1. 容器内文件是否存在;

    2. 环境变量与路径是否匹配;

    3. Sync Storage 配置是否多加或少加路径前缀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91645.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91645.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91645.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticJob怎么使用?

我们使用ElasticJob需要以下步骤: 1. 添加依赖 2. 配置任务(可以使用Spring命名空间配置或Java配置) 3. 实现任务逻辑(实现SimpleJob、DataflowJob等接口) 4. 启动任务 下面是一个详细的示例,包括Spring Bo…

TCP协议的特点和首部格式

文章目录TCP协议是什么?TCP协议的主要特点1. 面向连接2. 可靠传输3. 流量控制4. 拥塞控制TCP首部格式源端口和目标端口(各16位)序列号(32位)确认号(32位)数据偏移(4位)保…

IO流-文件的常用方法

1.关于java.io.File类- File类只能表示计算机中的文件或目录而不能获取或操作文件- 通过File类获得到文件的基本信息,如文件名、大小等,但不能获取文件内容- java中表示文件路径分隔符使用"/"或"\\"- File类中的构造方法- File(&quo…

AUTOSAR进阶图解==>AUTOSAR_SRS_E2E

AUTOSAR E2E通信保护解析 AUTOSAR End-to-End通信保护机制详解与应用目录 概述 1.1. AUTOSAR E2E通信保护的作用 1.2. E2E通信保护的应用场景AUTOSAR E2E架构 2.1. E2E组件层次结构 2.2. E2E库和E2E转换器E2E监控状态机 3.1. 状态定义与转换 3.2. 状态机实现E2E保护数据交换流…

镜像快速部署ollama+python+ai

算力租赁入口:https://www.jygpu.com为大家提供以上镜像快速部署方式,节约大家环境部署时间一键部署的便捷性传统自建GPU服务器需要经历复杂的硬件采购、驱动安装、环境配置等繁琐步骤,而现代​​GPU租赁价格对比​​显示,容器化平…

使用Gemini API开发领域智能聊天机器人的思路

以下是使用 Gemini API 开发软件自动化测试专家领域专属智能聊天机器人的详细思路及具体实现过程: 阶段一:基础准备与规划 (Foundation & Planning) 这个阶段的目标是明确方向、准备好所有必要的工具和凭证。 步骤 1:明确聊天机器人的目…

第13届蓝桥杯Python青少组_省赛_中/高级组_2022年4月17日真题

更多内容请查看网站:【试卷中心 -----> 蓝桥杯----> Python----> 省赛】 网站链接 青少年软件编程历年真题模拟题实时更新 第13届蓝桥杯Python青少组_省赛_中/高级组_2022年4月17日真题 一、选择题 第 1 题 下列二进制数中最大的是( &a…

sqli-labs:Less-17关卡详细解析

1. 思路🚀 本关的SQL语句为: $sql"SELECT username, password FROM users WHERE username $uname LIMIT 0,1"; $update"UPDATE users SET password $passwd WHERE username$row1";注入类型:字符串型(单引号…

文心一言:推动 AIGC 领域进步

文心一言:推动AIGC领域进步 关键词:文心一言、AIGC、自然语言处理、多模态生成、大模型、技术架构、应用场景 摘要:本文深入剖析百度文心一言在AIGC(人工智能生成内容)领域的技术创新与实践成果。通过解析其核心技术架构、多模态生成原理、工程化落地策略及行业应用案例,…

第15讲——微分方程

文章目录思维导图基本概念微分方程及其阶思维导图 基本概念 微分方程及其阶

RAGFlow Agent 知识检索节点源码解析:从粗排到精排的完整流程

RAGFlow Agent 知识检索节点深度解析:从查询到重排序的完整流程 1. 总体架构概览 RAGFlow Agent 中的知识检索(Retrieval)节点是整个RAG系统的核心组件,负责从知识库中找到与用户查询最相关的文档片段。检索流程可以分为以下几个…

Python算法实战:从排序到B+树全解析

Python中常见的算法示例 以下是Python中常见的算法示例,涵盖基础算法和经典问题解决方案,代码可直接运行: 排序算法 冒泡排序 def bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr…

【C++算法】85.BFS解决最短路径问题_最小基因变化

文章目录题目链接:题目描述:解法C 算法代码:题目链接: 433. 最小基因变化 题目描述: 解法 先看懂题目 先把这个问题转化:图论问题 边权为1的最短路问题。 为什么可以这么想?! 因为每…

基于单片机汽车少儿安全预警系统

文章目录一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】设计意义【5】市面上同类产品研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 模块的技术详情介绍1.6 框架图框架图说明&…

Mac 上配置jdk 环境变量

核心步骤是设置 JAVA_HOME 变量,并将其 bin 目录添加到系统的 PATH 变量中。 macOS 从 Catalina (10.15) 版本开始,默认的终端 Shell 从 bash 切换到了 zsh。因此,你需要先确定你正在使用的 Shell,然后编辑对应的配置文件。步骤一…

硬件-音频学习DAY1——音箱材料选择:密度板为何完胜实木

每日更新教程,评论区答疑解惑,小白也能变大神!" 目录 一.音箱材料选择的关键因素 二.密度板的声学优势 三.材料稳定性的对比 四.生产工艺的适应性 五.成本与环保的平衡 六.特殊场景的例外情况 七.消费者选购指南 八.行业发展趋势…

微波(Microwave)与毫米波(Millimeter wave)简介

一、电磁波频段划分,微波与毫米波所属 二、微波 可以看出UHF及以上的频段都可以统称为微波。记得之前上微波技术实验课的时候会接触比巴掌还大的金属波导,后来每次看到微波技术的时候都还是感到陌生。今天突然想到,不像在手机里就能完成的5G频…

ObjectMapper教程

ObjectMapper 简介ObjectMapper 是 Jackson 库的核心类,用于 Java 对象与 JSON 数据之间的相互转换。它支持序列化(对象转 JSON)和反序列化(JSON 转对象),广泛应用于 REST API、数据存储和配置处理等场景。…

【Node.js安装注意事项】-安装路径不能有空格

问题描述:在项目中使用 nodemon时,出现了nodemon 启动问题:nodemon : 无法将“nodemon”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。解决办法:在网上找了很多教程,试了很多办法,什么重新配置环境…

Shader开发(六)什么是着色器

在前面的章节中,我们简要提到了着色器的概念,现在有了渲染管线的基础知识,我们可以更深入地理解着色器的真正含义。着色器(Shader)是运行在图形处理单元(GPU)上的专用程序,这与我们日…