WSL2 + docker + cuda 报错nvidia-container-cli: mount error: file creation failed:libnvidia-ml.so.1: fi

在使用WSL2和Ubuntu22.04,显卡驱动528.89及CUDA11.7的环境中,通过Docker运行容器并尝试使用--gpusall时遇到错误。问题源于libnvidia-ml.so.1、libcuda.so.1等文件的存在。解决方案是删除这些文件,创建新镜像,然后成功利用新镜像启动带有GPU支持的容器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境

  • WSL2 + Ubuntu 22.04
  • 显卡驱动: 528.89
  • CUDA: 11.7

问题

在创建docker时使用--gpus all会报错:

docker run --gpus all -it -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:rw celinachild/orbslam2 /bin/bash
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: mount error: file creation failed: /var/lib/docker/overlay2/b92e32945b90e830d9786a89fa0c138933ab7657c8a459bafe551fb944836b65/merged/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1: file exists: unknown.
ERRO[0000] error waiting for container: context canceled

解决

参考 issue1551

解决方式是

  1. 先不使用gpu创建容器
  2. 删除相关文件(注意根据报错删除文件,不要删多)
rm -rf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 /usr/lib/x86_64-linux-gnu/libcuda.so.1
  1. 创建不包含这些文件的新的镜像
  2. 使用新的镜像创建容器

实现如下:

╭─changym at LAPTOP-CHANGYM in ~ (base)
╰─○ docker run -it celinachild/orbslam2
root@5ef649cf9ec8:/# rm /usr/lib/x86_64-linux-gnu/libnvidia-*
root@5ef649cf9ec8:/# rm /usr/lib/x86_64-linux-gnu/libcuda.so*
root@5ef649cf9ec8:/# rm /usr/lib/x86_64-linux-gnu/libnvcuvid.so.*
root@5ef649cf9ec8:/# exit
╭─changym at LAPTOP-CHANGYM in ~ (base)
╰─○ docker commit peaceful_ganguly orbslam2_cuda
sha256:2a93ce93469ed986226d119c2f4fe886b8b61554f20304cfcdd8832d8d02da0c
╭─changym at LAPTOP-CHANGYM in ~ (base)
╰─○ docker run --gpus all -it -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:rw orbslam2_cuda /bin/bash
root@47d847a00e55:/# nvidia-smi
Fri Apr 14 08:32:53 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.105.16   Driver Version: 528.89       CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Quadro T2000 wi...  On   | 00000000:01:00.0  On |                  N/A |
| N/A   51C    P8     3W /  35W |   1839MiB /  4096MiB |     10%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A        20      G   /Xwayland                       N/A      |
|    0   N/A  N/A        20      G   /Xwayland                       N/A      |
|    0   N/A  N/A        33      G   /Xwayland                       N/A      |
+-----------------------------------------------------------------------------+

此时可以正常创建容器。

<think>好的,用户遇到了Docker容器中与NVIDIA GPU相关的OCI运行时错误(HTTP 400),具体问题涉及libnvidia-ml.so.1缺失以及nvidia-container-cli的遗留模式解决方案。我需要根据提供的引用内容来整理解决方法,并生成相关问题。 首先,根据引用[1],错误提示是找不到libnvidia-ml.so,可能的原因是NVIDIA驱动未正确安装或路径问题。用户需要确认驱动安装情况,并检查该库文件的位置,可能需要将其路径添加到系统PATH中。 引用[2]提到在WSL环境下使用Apollo时出现类似的错误,同样涉及libnvidia-ml.so.1缺失。这可能意味着在WSL中需要额外的配置步骤,比如安装对应的驱动或确保库文件存在。 引用[3]中的解决办法建议先不使用GPU启动容器,改为CPU模式,避免文件冲突。这可能是一个临时解决方法,但用户最终需要解决GPU支持的问题。 综合这些信息,解决步骤可能包括:验证驱动安装、检查库文件路径、更新Docker配置、设置遗留模式,以及可能的WSL特定配置。此外,用户可能需要安装nvidia-container-toolkit并重启相关服务。 在生成相关问题时,需要考虑用户可能遇到的后续问题,例如驱动安装后的验证、遗留模式的具体操作、WSL环境下的额外步骤,以及如何测试是否成功。</think>### 解决Docker容器中NVIDIA GPU的OCI运行时错误(HTTP 400) #### 1. 验证NVIDIA驱动和库文件 - **检查驱动安装**:确保系统已正确安装NVIDIA显卡驱动,可通过命令 `nvidia-smi` 验证。若提示类似 `libnvidia-ml.so 缺失`,需重新安装驱动[^1]。 - **定位库文件路径**:找到 `libnvidia-ml.so.1` 的位置(通常在 `/usr/lib/x86_64-linux-gnu` 或 `/usr/lib/nvidia`),并将其路径添加到系统环境变量: ```bash export LD_LIBRARY_PATH=/usr/lib/nvidia:$LD_LIBRARY_PATH ``` #### 2. 配置NVIDIA Container Toolkit - **安装工具包**:更新仓库并安装依赖: ```bash distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt update && sudo apt install -y nvidia-container-toolkit ``` - **重启Docker服务**: ```bash sudo systemctl restart docker ``` #### 3. 启用遗留模式(Legacy Mode) 若问题持续,可能是 `nvidia-container-cli` 需要启用遗留模式: - 编辑配置文件 `/etc/nvidia-container-runtime/config.toml`,取消以下行的注释: ```toml #no-cgroups = false ``` 改为: ```toml no-cgroups = true ``` - 重启Docker服务并测试容器: ```bash docker run --gpus all nvidia/cuda:11.0-base nvidia-smi ``` #### 4. WSL环境特殊处理 若在Windows Subsystem for LinuxWSL)中运行: - 确保已安装WSL版的NVIDIA驱动,并在WSL内配置路径: ```bash echo 'export PATH=/usr/lib/wsl/lib:$PATH' >> ~/.bashrc source ~/.bashrc ``` #### 5. 临时使用CPU模式(调试) 若问题由文件冲突引起(如引用[3]),可暂时绕过GPU支持: ```bash docker run --rm -it --device /dev/dri <image_name> # 使用CPU启动容器 ``` ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值