You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker绑定外部磁盘失效:Jellyfin容器无法挂载外部存储目录

Docker绑定外部磁盘失效:Jellyfin容器无法挂载外部存储目录

嘿,我来帮你排查这个挂载问题!这种情况在外部磁盘绑定Docker容器时很常见,咱们一步步来定位问题:

第一步:先排查权限和归属问题

Linux的权限机制经常是罪魁祸首,咱们先确认宿主机上的目录权限:

  1. 执行ls -ld /disk/toshiba1/jellyfin,看输出的权限(比如drwxr-xr-x)和归属用户/组。
  2. Jellyfin官方容器默认用jellyfin用户运行,你可以先查这个用户的UID/GID:
    docker exec jellyfin id jellyfin
    
  3. 如果宿主机目录的归属不是容器内的jellyfin用户,或者权限不足(比如只有所有者能读写),容器就看不到里面的文件。你可以修改宿主机目录的权限:
    # 先开放基础权限(临时测试用)
    chmod -R 755 /disk/toshiba1/jellyfin
    # 或者直接修改归属为容器内的用户(更安全)
    chown -R <查到的UID>:<查到的GID> /disk/toshiba1/jellyfin
    

修改后重启容器,看看/media目录有没有内容。

第二步:检查挂载路径的拼写和大小写

Linux是大小写敏感的!你要确认:

  • 宿主机的路径/disk/toshiba1/jellyfin是不是完全正确,有没有把jellyfin写成Jellyfin或者其他拼写错误?
  • Docker Compose里的source路径是不是绝对路径(必须以/开头),你现在写的是对的,但再仔细核对一遍。

第三步:确认外部磁盘的挂载时机

如果你的外部磁盘是在Docker服务启动之后才挂载的,就会出现这个问题:

  • Docker启动容器时,如果宿主机的/disk/toshiba1/jellyfin目录还不存在(因为磁盘没挂载),Docker会自动创建一个空的目录,之后你挂载磁盘时,这个空目录会被磁盘覆盖,但容器绑定的是原来空目录的inode,不是现在的磁盘目录。
    解决方法:
  1. 先停止容器和Docker服务:
    docker compose down
    systemctl stop docker
    
  2. 确保磁盘已经挂载:mount | grep /disk/toshiba1,如果没挂载,手动挂载mount /disk/toshiba1
  3. 重新启动Docker服务和容器:
    systemctl start docker
    docker compose up -d
    

另外,建议你把磁盘挂载配置写到/etc/fstab里,加上x-systemd.automount参数,确保系统启动时自动挂载,且在Docker服务启动前完成挂载:

# 先查磁盘UUID:blkid | grep /dev/你的磁盘设备
# 然后在fstab里加一行
UUID=xxxx-xxxx /disk/toshiba1 ext4 defaults,x-systemd.automount 0 2

第四步:验证挂载本身是否正常

先排除Jellyfin镜像的问题,用一个简单的Ubuntu镜像测试挂载:

docker run --rm -v /disk/toshiba1/jellyfin:/media ubuntu ls /media

如果这个命令能输出你宿主机目录里的文件,说明挂载本身没问题,问题出在Jellyfin容器的权限或配置上;如果输出为空,那就是宿主机的挂载路径或磁盘本身的问题。

第五步:简化Docker Compose的挂载语法

你现在用的是长格式的bind挂载,语法是对的,但有时候换短格式能解决一些隐藏的问题:
把原来的挂载部分替换成:

volumes:
  - config:/config
  - cache:/cache
  - /disk/toshiba1/jellyfin:/media

然后重启容器试试。

备注:内容来源于stack exchange,提问作者Lilian Russo

火山引擎 最新活动