问题描述
使用脚本“一键更新 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.sh 的 oneclick_upgrade_emby,约 3617–3821 行。
建议修复
在删除旧容器前:
- 读取并保存
.HostConfig.DeviceRequests。
- 若非空,将其无损转换为 Docker
--gpus 参数并注入 runlike 命令。
- 转换失败时终止更新,不能删除旧容器。
- 重建后验证更新前后的
DeviceRequests 等价。
不建议仅根据 runtime=nvidia 强行添加 --gpus all,因为用户可能只分配指定 GPU。
已验证的临时兼容方案
将容器改为:
当前 runlike 会保留该参数,在本机 NVIDIA T1000 上已验证 h264_nvenc、hevc_nvenc 以及升级命令生成均正常。但根本修复仍应保留通用 DeviceRequests。
环境
- fnOS / Debian
- Docker 28.5.2
- containerd 2.2.1
- Emby 4.9.0.42
- NVIDIA T1000 8GB
ddsderek/runlike:latest
问题描述
使用脚本“一键更新 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}}'结果:
执行“一键更新 Emby”后:
Emby 日志:
根因
oneclick_upgrade_emby使用ddsderek/runlike生成重建命令:当前 runlike 能输出
--runtime=nvidia,但不读取 Docker 的HostConfig.DeviceRequests,因此不会输出--gpus all。随后脚本删除旧容器并按不完整命令重建,GPU 分配永久丢失。/etc/DDSRem/data_crep/install_xiaoya_emby.txt只在安装路径读取,一键更新路径没有读取,所以即使已经保存--gpus all也无法避免。相关代码:
all_in_one.sh的oneclick_upgrade_emby,约 3617–3821 行。建议修复
在删除旧容器前:
.HostConfig.DeviceRequests。--gpus参数并注入 runlike 命令。DeviceRequests等价。不建议仅根据
runtime=nvidia强行添加--gpus all,因为用户可能只分配指定 GPU。已验证的临时兼容方案
将容器改为:
当前 runlike 会保留该参数,在本机 NVIDIA T1000 上已验证
h264_nvenc、hevc_nvenc以及升级命令生成均正常。但根本修复仍应保留通用DeviceRequests。环境
ddsderek/runlike:latest