CentOS7下Docker调用NVIDIA Runtime遇权限拒绝问题排查
这是典型的SELinux权限限制导致的问题,结合你使用的CentOS 7(默认开启SELinux Enforcing模式)和较旧的Docker 1.13.1版本,具体原因拆解如下:
核心原因
当你直接执行docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi时,Docker会直接调用nvidia-smi二进制文件启动进程,此时该进程的SELinux上下文为container_t。而CentOS 7中NVIDIA设备文件(如/dev/nvidia0、/dev/nvidiactl等)的SELinux类型为nvidia_device_t,默认的SELinux策略不允许container_t类型的进程访问nvidia_device_t类型的设备,因此触发了"permission denied"错误。
而当你通过sh -c nvidia-smi执行时,Docker先启动sh进程(上下文同样是container_t),再由sh去调用nvidia-smi。此时nvidia-container-runtime注入的SELinux临时规则或环境设置会生效,允许shell进程间接访问NVIDIA设备,因此nvidia-smi能正常运行。
验证方法
你可以临时将SELinux切换为Permissive模式来验证:
sudo setenforce 0
然后再次运行直接执行nvidia-smi的命令:
sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
如果此时命令正常输出,就可以确认是SELinux的限制导致的问题。
永久解决方法
安装官方提供的nvidia-container-selinux包,该包会添加专门的SELinux规则,允许容器进程访问NVIDIA设备:
# 先添加nvidia-docker的yum源(如果还没配置) distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo # 安装nvidia-container-selinux sudo yum install -y nvidia-container-selinux
安装完成后,重启Docker服务:
sudo systemctl daemon-reload sudo systemctl restart docker
之后就可以直接运行docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi而不会再出现权限问题了。
内容的提问来源于stack exchange,提问作者yee379

