From c93cc31d5714346ca61b8585c550919b06ddc859 Mon Sep 17 00:00:00 2001 From: billy Date: Wed, 1 Oct 2025 10:27:51 +0800 Subject: [PATCH 1/3] fix: nvidia-container-toolkit missing files when mounting to Docker Because NVIDIA never does it correctly, we have to do this ourselves. - NVIDIA doesn't provide DRI3 support - NVIDIA never fixes this issue properly - NVIDIA likes to do things their own way - Top 3 public clouds are obsessed with NVIDIA, so we have no choice but to support it Ported from: https://github.com/selkies-project/docker-selkies-egl-desktop/blob/8dd03fba2a33ac774d61f46375a19ed1d9c5b51a/Dockerfile#L248-L264 --- root/etc/s6-overlay/s6-rc.d/init-video/run | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/root/etc/s6-overlay/s6-rc.d/init-video/run b/root/etc/s6-overlay/s6-rc.d/init-video/run index aaf9dfd..b75f8e7 100755 --- a/root/etc/s6-overlay/s6-rc.d/init-video/run +++ b/root/etc/s6-overlay/s6-rc.d/init-video/run @@ -33,3 +33,48 @@ do fi fi done + +# check if nvidia gpu is present +if which nvidia-smi >/dev/null 2>&1; then + # nvidia-container-toolkit may not place files correctly, so we set them up here + echo "**** NVIDIA GPU detected ****" + + OPENCL_ICDS=$(find /etc/OpenCL/vendors -name '*nvidia*.icd' 2>/dev/null) + # if no opencl icd found + if [ -z "${OPENCL_ICDS}" ]; then + echo "**** Setting up OpenCL ICD for NVIDIA ****" + mkdir -pm755 /etc/OpenCL/vendors/ + echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd + fi + + # find vulkan icds + ICDS=$(find /usr/share/vulkan/icd.d /etc/vulkan/icd.d -name '*nvidia*.json' 2>/dev/null) + # if no icd found + if [ -z "${ICDS}" ]; then + echo "**** Setting up Vulkan ICD for NVIDIA ****" + # get vulkan api version + VULKAN_API_VERSION=$(ldconfig -p | grep "libvulkan.so" | awk '{print $NF}' | xargs readlink | grep -oE "[0-9]+\.[0-9]+\.[0-9]+") + mkdir -pm755 /etc/vulkan/icd.d/ + echo "{\n\ + \"file_format_version\" : \"1.0.0\",\n\ + \"ICD\": {\n\ + \"library_path\": \"libGLX_nvidia.so.0\",\n\ + \"api_version\" : \"${VULKAN_API_VERSION}\"\n\ + }\n\ +}" > /etc/vulkan/icd.d/nvidia_icd.json + fi + + # find glvnd egl_vendor files + EGLS=$(find /usr/share/glvnd/egl_vendor.d /etc/glvnd/egl_vendor.d -name '*nvidia*.json' 2>/dev/null) + # if no egl_vendor file found + if [ -z "${EGLS}" ]; then + echo "**** Setting up EGL vendor file for NVIDIA ****" + mkdir -pm755 /etc/glvnd/egl_vendor.d/ + echo "{\n\ + \"file_format_version\" : \"1.0.0\",\n\ + \"ICD\": {\n\ + \"library_path\": \"libEGL_nvidia.so.0\"\n\ + }\n\ +}" > /etc/glvnd/egl_vendor.d/10_nvidia.json + fi +fi From 4240d5bc2ed08b754931ce8a709e61d40e66c29d Mon Sep 17 00:00:00 2001 From: billy Date: Wed, 1 Oct 2025 11:28:17 +0800 Subject: [PATCH 2/3] fix: improve formatting for NVIDIA ICD and EGL vendor files --- root/etc/s6-overlay/s6-rc.d/init-video/run | 30 ++++++++++++---------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/root/etc/s6-overlay/s6-rc.d/init-video/run b/root/etc/s6-overlay/s6-rc.d/init-video/run index b75f8e7..e3ff2cb 100755 --- a/root/etc/s6-overlay/s6-rc.d/init-video/run +++ b/root/etc/s6-overlay/s6-rc.d/init-video/run @@ -55,13 +55,15 @@ if which nvidia-smi >/dev/null 2>&1; then # get vulkan api version VULKAN_API_VERSION=$(ldconfig -p | grep "libvulkan.so" | awk '{print $NF}' | xargs readlink | grep -oE "[0-9]+\.[0-9]+\.[0-9]+") mkdir -pm755 /etc/vulkan/icd.d/ - echo "{\n\ - \"file_format_version\" : \"1.0.0\",\n\ - \"ICD\": {\n\ - \"library_path\": \"libGLX_nvidia.so.0\",\n\ - \"api_version\" : \"${VULKAN_API_VERSION}\"\n\ - }\n\ -}" > /etc/vulkan/icd.d/nvidia_icd.json + cat > /etc/vulkan/icd.d/nvidia_icd.json << EOF +{ + "file_format_version" : "1.0.0", + "ICD": { + "library_path": "libGLX_nvidia.so.0", + "api_version" : "${VULKAN_API_VERSION}" + } +} +EOF fi # find glvnd egl_vendor files @@ -70,11 +72,13 @@ if which nvidia-smi >/dev/null 2>&1; then if [ -z "${EGLS}" ]; then echo "**** Setting up EGL vendor file for NVIDIA ****" mkdir -pm755 /etc/glvnd/egl_vendor.d/ - echo "{\n\ - \"file_format_version\" : \"1.0.0\",\n\ - \"ICD\": {\n\ - \"library_path\": \"libEGL_nvidia.so.0\"\n\ - }\n\ -}" > /etc/glvnd/egl_vendor.d/10_nvidia.json + cat > /etc/glvnd/egl_vendor.d/10_nvidia.json << EOF +{ + "file_format_version" : "1.0.0", + "ICD": { + "library_path": "libEGL_nvidia.so.0" + } +} +EOF fi fi From 9abc8e1201d66eec3abaf7d8ed650251e87575ed Mon Sep 17 00:00:00 2001 From: billy Date: Wed, 1 Oct 2025 11:59:07 +0800 Subject: [PATCH 3/3] fix: add fallback for Vulkan API version in NVIDIA setup --- root/etc/s6-overlay/s6-rc.d/init-video/run | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/root/etc/s6-overlay/s6-rc.d/init-video/run b/root/etc/s6-overlay/s6-rc.d/init-video/run index e3ff2cb..260bcb4 100755 --- a/root/etc/s6-overlay/s6-rc.d/init-video/run +++ b/root/etc/s6-overlay/s6-rc.d/init-video/run @@ -54,6 +54,11 @@ if which nvidia-smi >/dev/null 2>&1; then echo "**** Setting up Vulkan ICD for NVIDIA ****" # get vulkan api version VULKAN_API_VERSION=$(ldconfig -p | grep "libvulkan.so" | awk '{print $NF}' | xargs readlink | grep -oE "[0-9]+\.[0-9]+\.[0-9]+") + # Fallback if pipeline fails + if [ -z "${VULKAN_API_VERSION}" ]; then + # version 1.1 or greater allows vulkan-loader to load the driver's dynamic library + VULKAN_API_VERSION="1.1.0" + fi mkdir -pm755 /etc/vulkan/icd.d/ cat > /etc/vulkan/icd.d/nvidia_icd.json << EOF {