我的docker已经配置结束,但是在运行以下指令的时候
sudo docker run --gpus all --shm-size 32g -p 30000:30000 -p 7860:7860 -p 8000:8000 --ipc=host -it mineru-sglang:latest /bin/bash
遇到一个bug:
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: initialization error: load library failed: libnvidia-ml.so.1: cannot open shared object file: no such file or directory: unknown.
第一解决阶段
先看nvidia-smi有没有反应,没有的话,就是nvidia驱动有问题哦!快去配置驱动!
如果不是,就请跟着我往下走,包准帮您解决!
开始我以为是我没有libnvidia-ml.so.1文件,因为我在ubuntu文件夹里,没有搜索到这个文件
然后直接 ls后,发现它就在/usr/lib/文件夹下面
第二解决阶段
虽然主机上确实存在 libnvidia-ml.so.1 文件,但 nvidia-container-toolkit 在自动挂载时仍然无法找到它,这通常是由于工具包的配置或运行时环境存在深层问题。以下是针对性的解决步骤:
1. 检查 Docker 守护进程配置是否正确
nvidia-ctk 配置后,需要确保 /etc/docker/daemon.json 中正确添加了 NVIDIA 运行时。执行以下命令查看配置:
cat /etc/docker/daemon.json
正确配置示例(应包含 default-runtime 和 runtimes.nvidia):
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
如果配置缺失或错误,手动编辑文件并重启 Docker:
sudo nano /etc/docker/daemon.json # 编辑配置
sudo systemctl restart docker # 重启生效
2. 主要bug来了:检查Default Runtime是否正确生效
运行
docker info | grep "Default Runtime"
正确反馈应该是: Default Runtime: Nvidia
但我的是: Default Runtime: runc
核心问题找到了:Docker 并未实际应用我们配置的 default-runtime: nvidia,仍然使用默认的 runc 运行时,这就是 nvidia-container-toolkit 无法正常工作的关键原因。
为什么配置未生效?
docker info | grep “Default Runtime” 显示 Default Runtime: runc,但之前的 daemon.json 明明配置了 default-runtime: “nvidia”,这通常是因为:
Docker 守护进程未正确加载配置文件(可能是重启不彻底或配置文件有隐性错误)。
配置文件权限问题(Docker 无法读取 /etc/docker/daemon.json)。
也就是说,只要实现Default Runtime: Nvidia,我的docker镜像就可以调用GPU啦
第三解决阶段
彻底重启 Docker 服务(确保配置重载),普通的 systemctl restart docker 有时可能不彻底,建议按以下步骤操作:
sudo systemctl stop docker
sudo pkill -f docker
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl status docker # 检查 Docker 状态(确保 active (running))
进入上述界面,显示active running后,输入q,退出该界面,并执行:
docker info | grep "Default Runtime"
正常结果应显示 Default Runtime: nvidia,此时 --gpus all 才能正确触发 NVIDIA 运行时。
但我的显示成了
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
从输出来看,客户端报错时试图连接的是 /var/run/docker.sock—— 这是关键的路径差异!
本质问题:/var/run 本应是 /run 的软链接(Linux 系统默认配置,让旧路径兼容新路径),但我的系统中这个软链接可能缺失或损坏,导致 Docker 客户端找错了套接字文件位置(去 /var/run 找,实际在 /run)。
解决办法:修复 /var/run 到 /run 的软链接
直接创建软链接:
sudo ln -s /run /var/run
为什么会出现这个问题?
/var/run 是 Linux 早期的临时文件目录,后来统一规范为 /run,系统默认通过软链接让 /var/run 指向 /run 以兼容旧程序。若软链接被误删除、修改或系统初始化时未创建,就会导致客户端(如 docker 命令)按旧路径 /var/run/docker.sock 查找时失败,即使实际文件在 /run 中存在。
最终验证连接
当 /run/docker.sock 成功生成后(ls -l 能看到文件),执行:
sudo docker info | grep "Default Runtime"
输出 Default Runtime: nvidia 即表示通信正常,nvidia 运行时已生效。
若验证成功,即可正常加载镜像并启动容器:
加载镜像(若之前清理过数据):
sudo docker load -i 你的镜像文件.tar
启动带 GPU 支持的容器(此时 --gpus all 会正常挂载 NVIDIA 库):
sudo docker run --gpus all --shm-size 32g -p 30000:30000 -p 7860:7860 -p 8000:8000 --ipc=host -it mineru-sglang:latest /bin/bash
1487

被折叠的 条评论
为什么被折叠?



