ehfd 4 роки тому
батько
коміт
4d53dcb385
2 змінених файлів з 39 додано та 19 видалено
  1. 14 5
      Dockerfile
  2. 25 14
      bootstrap.sh

+ 14 - 5
Dockerfile

@@ -80,7 +80,7 @@ RUN apt-get install -y \
 # Driver version must be equal to the host
 #ARG BASE_URL=https://us.download.nvidia.com/tesla
 ARG BASE_URL=http://us.download.nvidia.com/XFree86/Linux-x86_64
-ENV DRIVER_VERSION 450.66
+ENV DRIVER_VERSION 450.80.02
 RUN cd /tmp && \
     curl -fSsl -O $BASE_URL/$DRIVER_VERSION/NVIDIA-Linux-x86_64-$DRIVER_VERSION.run && \
     sh NVIDIA-Linux-x86_64-$DRIVER_VERSION.run -x && \
@@ -113,9 +113,18 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
 
 # Install Vulkan
 RUN apt-get update && apt-get install -y --no-install-recommends \
-        libvulkan1 \
-        vulkan-utils && \
-    rm -rf /var/lib/apt/lists/*
+        libvulkan-dev \
+        vulkan-validationlayers-dev \
+        vulkan-utils \
+        meson && \
+    rm -rf /var/lib/apt/lists/* && \
+    cd /tmp && \
+    git clone https://github.com/aejsmith/vkdevicechooser && \
+    cd vkdevicechooser && \
+    meson builddir --prefix=/usr && \
+    ninja -C builddir && \
+    meson install -C builddir && \
+    cd / && rm -rf /tmp/*
 
 # Sound driver including PulseAudio and GTK library
 # If you want to use sounds on docker, try 'pulseaudio --start'
@@ -148,7 +157,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
     rm -rf /var/lib/apt/lists/* && \
     groupadd -g 1000 user && \
     useradd -ms /bin/bash user -u 1000 -g 1000 && \
-    usermod -a -G adm,audio,bluetooth,cdrom,dialout,dip,fax,floppy,input,lpadmin,netdev,plugdev,pulse-access,render,scanner,ssh,sudo,tape,tty,video,voice user && \
+    usermod -a -G adm,audio,cdrom,dialout,dip,fax,floppy,input,lpadmin,netdev,plugdev,render,scanner,ssh,sudo,tape,tty,video,voice user && \
     echo "user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
     chown -R user:user /home/user && \
     echo "user:${VNCPASS}" | chpasswd

+ 25 - 14
bootstrap.sh

@@ -3,39 +3,50 @@ set -e
 
 trap "echo TRAPed signal" HUP INT QUIT KILL TERM
 
-echo "user:${VNCPASS}" | sudo chpasswd
+echo "user:$VNCPASS" | sudo chpasswd
 
 # NVIDIA driver version inside the container from Dockerfile must be equal to the host
-HEX_ID=$(sudo nvidia-smi --query-gpu=pci.bus_id --id=$(echo $NVIDIA_VISIBLE_DEVICES | cut -d ',' -f1) --format=csv | sed -n 2p)
-IFS=":." ARR_ID=($HEX_ID)
+HEX_ID=$(sudo nvidia-smi --query-gpu=pci.bus_id --id="$(echo "$NVIDIA_VISIBLE_DEVICES" | cut -d ',' -f1)" --format=csv | sed -n 2p)
+IFS=":." ARR_ID=("$HEX_ID")
 unset IFS
 BUS_ID=PCI:$((16#${ARR_ID[1]})):$((16#${ARR_ID[2]})):$((16#${ARR_ID[3]}))
 # Leave out --use-display-device=None if GPU is headless such as Tesla and download links of such GPU drivers in Dockerfile should also be changed
-sudo nvidia-xconfig --virtual=${SIZEW}x${SIZEH} --allow-empty-initial-configuration --enable-all-gpus --no-use-edid-dpi --busid=$BUS_ID --use-display-device=None
+sudo nvidia-xconfig --virtual="${SIZEW}x$SIZEH" --allow-empty-initial-configuration --enable-all-gpus --no-use-edid-dpi --busid="$BUS_ID" --use-display-device=None
 
-if [ "x${SHARED}" == "xTRUE" ]
-then
-    export SHARESTRING="-shared"
+if [ "x$SHARED" == "xTRUE" ]; then
+  export SHARESTRING="-shared"
 fi
 
 shopt -s extglob
-for TTY in /dev/tty+([0-9])
-do
-if [ -w $TTY ]
-then
-    /usr/bin/X tty$(echo $TTY | grep -Eo '[0-9]+$') :0 &
+for TTY in /dev/tty+([0-9]); do
+  if [ -w "$TTY" ]; then
+    /usr/bin/X tty"$(echo "$TTY" | grep -Eo '[0-9]+$')" :0 &
     break
-fi
+  fi
 done
 sleep 1
 
-x11vnc -display :0 -passwd $VNCPASS -forever -xkb -rfbport 5900 $SHARESTRING &
+x11vnc -display :0 -passwd "$VNCPASS" -forever -xkb -rfbport 5900 "$SHARESTRING" &
 sleep 1
 
 /opt/noVNC/utils/launch.sh --vnc localhost:5900 --listen 5901 &
 sleep 1
 
 export DISPLAY=:0
+if vulkaninfo | grep "$(echo "$NVIDIA_VISIBLE_DEVICES" | cut -d ',' -f1 | cut -c 5-)" | grep -q ^; then
+  VK=0
+  while true; do
+    if ENABLE_DEVICE_CHOOSER_LAYER=1 VULKAN_DEVICE_INDEX=$VK vulkaninfo | grep "$(echo "$NVIDIA_VISIBLE_DEVICES" | cut -d ',' -f1 | cut -c 5-)" | grep -q ^; then
+      export ENABLE_DEVICE_CHOOSER_LAYER=1
+      export VULKAN_DEVICE_INDEX="$VK"
+      break
+    fi
+    VK=$((VK + 1))
+  done
+else
+  echo "Vulkan not available for current GPU."
+fi
+
 mate-session &
 sleep 1