# Ubuntu release versions 18.04 and 20.04 are supported ARG UBUNTU_RELEASE=20.04 ARG CUDA_VERSION=11.1.1 FROM nvcr.io/nvidia/cudagl:${CUDA_VERSION}-runtime-ubuntu${UBUNTU_RELEASE} LABEL maintainer "https://github.com/ehfd,https://github.com/danisla" ARG UBUNTU_RELEASE ARG CUDA_VERSION # Make all NVIDIA GPUs visible, but we want to manually install drivers ARG NVIDIA_VISIBLE_DEVICES=all # Supress interactive menu while installing keyboard-configuration ARG DEBIAN_FRONTEND=noninteractive ENV NVIDIA_DRIVER_CAPABILITIES all ENV PULSE_SERVER 127.0.0.1:4713 # Default environment variables (password is "mypasswd") ENV TZ UTC ENV SIZEW 1920 ENV SIZEH 1080 ENV REFRESH 60 ENV DPI 96 ENV CDEPTH 24 ENV VIDEO_PORT DFP ENV PASSWD mypasswd ENV NOVNC_ENABLE false ENV WEBRTC_ENCODER nvh264enc ENV WEBRTC_ENABLE_RESIZE false ENV ENABLE_AUDIO true ENV ENABLE_BASIC_AUTH true # Install locales to prevent errors RUN apt-get clean && \ apt-get update && apt-get install --no-install-recommends -y locales && \ rm -rf /var/lib/apt/lists/* && \ locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 # Install Xorg, MATE Desktop, and others RUN dpkg --add-architecture i386 && \ apt-get update && apt-get install --no-install-recommends -y \ software-properties-common \ apt-utils \ build-essential \ ca-certificates \ kmod \ libc6:i386 \ libc6-dev \ curl \ file \ wget \ gzip \ zip \ unzip \ gcc \ git \ jq \ make \ python \ python-numpy \ python3 \ python3-numpy \ mlocate \ nano \ vim \ htop \ firefox \ supervisor \ net-tools \ libpci3 \ libelf-dev \ libglvnd-dev \ vainfo \ vdpauinfo \ pkg-config \ mesa-utils \ mesa-utils-extra \ libglu1 \ libglu1:i386 \ libsm6 \ libxv1 \ libxv1:i386 \ libxtst6 \ libxtst6:i386 \ x11-xkb-utils \ x11-xserver-utils \ x11-apps \ dbus-x11 \ libdbus-c++-1-0v5 \ xauth \ xinit \ xfonts-base \ xkb-data \ libxrandr-dev \ xorg-dev && \ apt-get install -y ubuntu-mate-desktop libreoffice && \ if [ "${UBUNTU_RELEASE}" = "18.04" ]; then apt-get install --no-install-recommends -y vulkan-utils; else apt-get install --no-install-recommends -y vulkan-tools; fi && \ # Support libva and VA-API through NVIDIA VDPAU curl -fsSL -o /tmp/vdpau-va-driver.deb "https://launchpad.net/~saiarcot895/+archive/ubuntu/chromium-dev/+files/vdpau-va-driver_0.7.4-6ubuntu2~ppa1~18.04.1_amd64.deb" && apt-get install --no-install-recommends -y /tmp/vdpau-va-driver.deb && rm -rf /tmp/* && \ # Remove Bluetooth packages that throw errors apt-get autoremove --purge -y \ blueman \ pulseaudio-module-bluetooth && \ rm -rf /var/lib/apt/lists/* # Wine, Winetricks, and PlayOnLinux, comment out the below lines to disable ARG WINE_BRANCH=devel RUN if [ "${UBUNTU_RELEASE}" = "18.04" ]; then add-apt-repository ppa:cybermax-dexter/sdl2-backport; fi && \ curl -fsSL -o /usr/share/keyrings/winehq-archive.key "https://dl.winehq.org/wine-builds/winehq.key" && \ curl -fsSL -o "/etc/apt/sources.list.d/winehq-$(grep VERSION_CODENAME= /etc/os-release | cut -d= -f2).sources" "https://dl.winehq.org/wine-builds/ubuntu/dists/$(grep VERSION_CODENAME= /etc/os-release | cut -d= -f2)/winehq-$(grep VERSION_CODENAME= /etc/os-release | cut -d= -f2).sources" && \ apt-get update && apt-get install -y \ winehq-${WINE_BRANCH} \ q4wine \ playonlinux && \ rm -rf /var/lib/apt/lists/* && \ curl -fsSL -o /usr/bin/winetricks "https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks" && \ chmod 755 /usr/bin/winetricks && \ curl -fsSL -o /usr/share/bash-completion/completions/winetricks "https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks.bash-completion" # Install latest selkies-gstreamer (https://github.com/selkies-project/selkies-gstreamer) build, Python application, and web application RUN apt-get update && apt-get install --no-install-recommends -y \ build-essential \ python3-pip \ python3-dev \ python3-gi \ python3-setuptools \ python3-wheel \ tzdata \ sudo \ udev \ xclip \ x11-utils \ xdotool \ wmctrl \ jq \ gdebi-core \ x11-xserver-utils \ xserver-xorg-core \ libopus0 \ libgdk-pixbuf2.0-0 \ libsrtp2-1 \ libxdamage1 \ libxml2-dev \ libwebrtc-audio-processing1 \ libcairo-gobject2 \ pulseaudio \ libpulse0 \ libpangocairo-1.0-0 \ libgirepository1.0-dev \ libjpeg-dev \ zlib1g-dev \ x264 && \ rm -rf /var/lib/apt/lists/* && \ cd /opt && \ SELKIES_VERSION=$(curl -fsSL "https://api.github.com/repos/selkies-project/selkies-gstreamer/releases/latest" | jq -r '.tag_name' | sed 's/[^0-9\.\-]*//g') && \ curl -fsSL "https://github.com/selkies-project/selkies-gstreamer/releases/download/v${SELKIES_VERSION}/selkies-gstreamer-v${SELKIES_VERSION}-ubuntu${UBUNTU_RELEASE}.tgz" | tar -zxf - && \ curl -O -fsSL "https://github.com/selkies-project/selkies-gstreamer/releases/download/v${SELKIES_VERSION}/selkies_gstreamer-${SELKIES_VERSION}-py3-none-any.whl" && pip3 install "selkies_gstreamer-${SELKIES_VERSION}-py3-none-any.whl" && rm -f "selkies_gstreamer-${SELKIES_VERSION}-py3-none-any.whl" && \ pip3 install -e "git+https://github.com/selkies-project/python-xlib.git@add-xfixes-cursor#egg=python-xlib" && \ curl -fsSL "https://github.com/selkies-project/selkies-gstreamer/releases/download/v${SELKIES_VERSION}/selkies-gstreamer-web-v${SELKIES_VERSION}.tgz" | tar -zxf - && \ cd /usr/local/cuda/lib64 && sudo find . -maxdepth 1 -type l -name "*libnvrtc.so.*" -exec sh -c 'ln -sf $(basename {}) libnvrtc.so' \; # Install latest noVNC web interface for fallback RUN apt-get update && apt-get install --no-install-recommends -y \ autoconf \ automake \ autotools-dev \ chrpath \ debhelper \ jq \ python \ python-numpy \ python3 \ python3-numpy \ libc6-dev \ libcairo2-dev \ libjpeg-turbo8-dev \ libssl-dev \ libv4l-dev \ libvncserver-dev \ libtool-bin \ libxdamage-dev \ libxinerama-dev \ libxrandr-dev \ libxss-dev \ libxtst-dev \ libavahi-client-dev && \ rm -rf /var/lib/apt/lists/* && \ X11VNC_VERSION=$(curl -fsSL "https://api.github.com/repos/LibVNC/x11vnc/releases/latest" | jq -r '.tag_name' | sed 's/[^0-9\.\-]*//g') && \ curl -fsSL https://github.com/LibVNC/x11vnc/archive/${X11VNC_VERSION}.tar.gz | tar -xzf - -C /tmp && \ cd /tmp/x11vnc-${X11VNC_VERSION} && autoreconf -fi && ./configure && make install && cd / && rm -rf /tmp/* && \ NOVNC_VERSION=$(curl -fsSL "https://api.github.com/repos/noVNC/noVNC/releases/latest" | jq -r '.tag_name' | sed 's/[^0-9\.\-]*//g') && \ curl -fsSL https://github.com/novnc/noVNC/archive/v${NOVNC_VERSION}.tar.gz | tar -xzf - -C /opt && \ mv /opt/noVNC-${NOVNC_VERSION} /opt/noVNC && \ ln -s /opt/noVNC/vnc.html /opt/noVNC/index.html && \ git clone https://github.com/novnc/websockify /opt/noVNC/utils/websockify # Add custom packages below this comment # Create user with password ${PASSWD} RUN apt-get update && apt-get install --no-install-recommends -y \ sudo && \ rm -rf /var/lib/apt/lists/* && \ groupadd -g 1000 user && \ useradd -ms /bin/bash user -u 1000 -g 1000 && \ usermod -a -G adm,audio,cdrom,dialout,dip,fax,floppy,input,lp,lpadmin,netdev,plugdev,scanner,ssh,sudo,tape,tty,video,voice user && \ echo "user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \ chown user:user /home/user && \ echo "user:${PASSWD}" | chpasswd && \ ln -snf "/usr/share/zoneinfo/$TZ" /etc/localtime && echo "$TZ" > /etc/timezone COPY entrypoint.sh /etc/entrypoint.sh RUN chmod 755 /etc/entrypoint.sh COPY selkies-gstreamer-entrypoint.sh /etc/selkies-gstreamer-entrypoint.sh RUN chmod 755 /etc/selkies-gstreamer-entrypoint.sh COPY supervisord.conf /etc/supervisord.conf RUN chmod 755 /etc/supervisord.conf EXPOSE 8080 USER user ENV USER=user WORKDIR /home/user ENTRYPOINT ["/usr/bin/supervisord"]