Skip to content

[Bug] 一键更新 Emby 丢失 Docker GPU DeviceRequests,导致 NVENC 失效 #368

Description

@doomsday616

问题描述

使用脚本“一键更新 Emby”后,原容器通过 --gpus all 配置的 NVIDIA GPU 设备请求会丢失,导致 Emby 的 NVENC 硬件转码失效。

该问题不是 NVIDIA 驱动或环境变量错误:更新前 NVENC 正常,更新后仍保留 NVIDIA_VISIBLE_DEVICES=all,但 HostConfig.DeviceRequests 变为 null

复现

更新前:

docker inspect emby --format 'Runtime={{.HostConfig.Runtime}} DeviceRequests={{json .HostConfig.DeviceRequests}}'

结果:

Runtime=runc DeviceRequests=[{"Driver":"","Count":-1,"DeviceIDs":null,"Capabilities":[["gpu"]],"Options":{}}]

执行“一键更新 Emby”后:

Runtime=runc DeviceRequests=null

Emby 日志:

NvidiaCodecProvider: Process exited with code 1 - Failed

根因

oneclick_upgrade_emby 使用 ddsderek/runlike 生成重建命令:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock ddsderek/runlike emby

当前 runlike 能输出 --runtime=nvidia,但不读取 Docker 的 HostConfig.DeviceRequests,因此不会输出 --gpus all。随后脚本删除旧容器并按不完整命令重建,GPU 分配永久丢失。

/etc/DDSRem/data_crep/install_xiaoya_emby.txt 只在安装路径读取,一键更新路径没有读取,所以即使已经保存 --gpus all 也无法避免。

相关代码:all_in_one.shoneclick_upgrade_emby,约 3617–3821 行。

建议修复

在删除旧容器前:

  1. 读取并保存 .HostConfig.DeviceRequests
  2. 若非空,将其无损转换为 Docker --gpus 参数并注入 runlike 命令。
  3. 转换失败时终止更新,不能删除旧容器。
  4. 重建后验证更新前后的 DeviceRequests 等价。

不建议仅根据 runtime=nvidia 强行添加 --gpus all,因为用户可能只分配指定 GPU。

已验证的临时兼容方案

将容器改为:

--runtime=nvidia

当前 runlike 会保留该参数,在本机 NVIDIA T1000 上已验证 h264_nvenchevc_nvenc 以及升级命令生成均正常。但根本修复仍应保留通用 DeviceRequests

环境

  • fnOS / Debian
  • Docker 28.5.2
  • containerd 2.2.1
  • Emby 4.9.0.42
  • NVIDIA T1000 8GB
  • ddsderek/runlike:latest

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions