|
|
@@ -1,48 +1,268 @@
|
|
|
# syntax=docker/dockerfile:1.7
|
|
|
|
|
|
-# ============================================================
|
|
|
+# =============================================================================
|
|
|
# Versions
|
|
|
-# ============================================================
|
|
|
+# =============================================================================
|
|
|
|
|
|
ARG SUNSHINE_VERSION=v2025.924.154138
|
|
|
|
|
|
+# Update these values whenever the NVIDIA GPU Operator driver changes.
|
|
|
+ARG NVIDIA_DRIVER_BRANCH=580
|
|
|
ARG NVIDIA_DRIVER_VERSION=580.126.20
|
|
|
ARG NVIDIA_DRIVER_PACKAGE_VERSION=580.126.20-1ubuntu1
|
|
|
|
|
|
-# ============================================================
|
|
|
-# ============================================================
|
|
|
|
|
|
+# =============================================================================
|
|
|
+# Sunshine package source
|
|
|
+# =============================================================================
|
|
|
|
|
|
-# On récupère le paquet Sunshine depuis l'image officielle.
|
|
|
FROM ghcr.io/lizardbyte/sunshine:${SUNSHINE_VERSION}-ubuntu-24.04 AS sunshine
|
|
|
|
|
|
-# PoC : on réutilise volontairement notre environnement graphique déjà validé.
|
|
|
-FROM image-registry.openshift-image-registry.svc:5000/desktop/desktop:latest
|
|
|
|
|
|
-# Import global ARGs into this build stage
|
|
|
+# =============================================================================
|
|
|
+# Main image
|
|
|
+# =============================================================================
|
|
|
+
|
|
|
+FROM docker.io/library/ubuntu:24.04
|
|
|
+
|
|
|
+ARG NVIDIA_DRIVER_BRANCH
|
|
|
ARG NVIDIA_DRIVER_VERSION
|
|
|
ARG NVIDIA_DRIVER_PACKAGE_VERSION
|
|
|
|
|
|
-ENV EXPECTED_NVIDIA_DRIVER_VERSION=${NVIDIA_DRIVER_VERSION} \
|
|
|
+ARG USER_NAME=ubuntu
|
|
|
+ARG USER_UID=1000
|
|
|
+ARG USER_GID=1000
|
|
|
+
|
|
|
+ENV DEBIAN_FRONTEND=noninteractive \
|
|
|
+ HOME=/home/ubuntu \
|
|
|
+ USER=ubuntu \
|
|
|
+ DISPLAY=:20 \
|
|
|
+ DISPLAY_SIZEW=1920 \
|
|
|
+ DISPLAY_SIZEH=1080 \
|
|
|
+ DISPLAY_REFRESH=120 \
|
|
|
+ DISPLAY_DPI=96 \
|
|
|
+ DISPLAY_CDEPTH=24 \
|
|
|
+ VIDEO_PORT=HDMI-0 \
|
|
|
+ TZ=Europe/Paris \
|
|
|
+ LANG=fr_FR.UTF-8 \
|
|
|
+ LANGUAGE=fr_FR:fr \
|
|
|
+ LC_ALL=fr_FR.UTF-8 \
|
|
|
+ XDG_RUNTIME_DIR=/tmp/runtime-ubuntu \
|
|
|
+ PIPEWIRE_RUNTIME_DIR=/tmp/runtime-ubuntu \
|
|
|
+ PULSE_RUNTIME_PATH=/tmp/runtime-ubuntu/pulse \
|
|
|
+ PULSE_SERVER=unix:/tmp/runtime-ubuntu/pulse/native \
|
|
|
+ NVIDIA_VISIBLE_DEVICES=all \
|
|
|
+ NVIDIA_DRIVER_CAPABILITIES=all \
|
|
|
+ EXPECTED_NVIDIA_DRIVER_VERSION=${NVIDIA_DRIVER_VERSION} \
|
|
|
NVIDIA_I386_PACKAGE_VERSION=${NVIDIA_DRIVER_PACKAGE_VERSION}
|
|
|
|
|
|
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
|
|
+
|
|
|
USER root
|
|
|
|
|
|
-# L'image Sunshine officielle conserve le .deb utilisé pour installer Sunshine.
|
|
|
+
|
|
|
+# =============================================================================
|
|
|
+# Base desktop / gaming environment
|
|
|
+# =============================================================================
|
|
|
+
|
|
|
+RUN dpkg --add-architecture i386 \
|
|
|
+ && apt-get update \
|
|
|
+ && apt-get install --no-install-recommends -y \
|
|
|
+ alsa-utils \
|
|
|
+ ca-certificates \
|
|
|
+ curl \
|
|
|
+ dbus \
|
|
|
+ dbus-user-session \
|
|
|
+ dbus-x11 \
|
|
|
+ file \
|
|
|
+ fonts-dejavu \
|
|
|
+ fonts-liberation \
|
|
|
+ fonts-noto \
|
|
|
+ fonts-noto-color-emoji \
|
|
|
+ kmod \
|
|
|
+ libasound2-plugins \
|
|
|
+ libcap2-bin \
|
|
|
+ libegl1 \
|
|
|
+ libgbm1 \
|
|
|
+ libgl1 \
|
|
|
+ libglvnd0 \
|
|
|
+ libglx0 \
|
|
|
+ libpciaccess0 \
|
|
|
+ libpulse0 \
|
|
|
+ libvulkan1 \
|
|
|
+ libx11-6 \
|
|
|
+ libx11-xcb1 \
|
|
|
+ libxdamage1 \
|
|
|
+ libxext6 \
|
|
|
+ libxfixes3 \
|
|
|
+ libxinerama1 \
|
|
|
+ libxrandr2 \
|
|
|
+ libxss1 \
|
|
|
+ libxtst6 \
|
|
|
+ locales \
|
|
|
+ mesa-utils \
|
|
|
+ pciutils \
|
|
|
+ pipewire \
|
|
|
+ pipewire-pulse \
|
|
|
+ procps \
|
|
|
+ psmisc \
|
|
|
+ pulseaudio-utils \
|
|
|
+ sudo \
|
|
|
+ supervisor \
|
|
|
+ tzdata \
|
|
|
+ udev \
|
|
|
+ vulkan-tools \
|
|
|
+ wireplumber \
|
|
|
+ x11-utils \
|
|
|
+ x11-xserver-utils \
|
|
|
+ xauth \
|
|
|
+ xcvt \
|
|
|
+ xdg-user-dirs \
|
|
|
+ xdg-utils \
|
|
|
+ xfce4 \
|
|
|
+ xfce4-terminal \
|
|
|
+ xkb-data \
|
|
|
+ xserver-xorg-core \
|
|
|
+ xserver-xorg-input-libinput \
|
|
|
+ xserver-xorg-legacy \
|
|
|
+ xz-utils \
|
|
|
+ && sed -i \
|
|
|
+ -e 's/^# *fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' \
|
|
|
+ -e 's/^# *en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' \
|
|
|
+ /etc/locale.gen \
|
|
|
+ && locale-gen \
|
|
|
+ && apt-get clean \
|
|
|
+ && rm -rf \
|
|
|
+ /var/lib/apt/lists/* \
|
|
|
+ /var/cache/apt/* \
|
|
|
+ /var/cache/debconf/* \
|
|
|
+ /tmp/* \
|
|
|
+ /var/tmp/*
|
|
|
+
|
|
|
+
|
|
|
+# =============================================================================
|
|
|
+# Desktop user
|
|
|
+# =============================================================================
|
|
|
+
|
|
|
+RUN set -eux; \
|
|
|
+ if ! getent group "${USER_GID}" >/dev/null; then \
|
|
|
+ groupadd --gid "${USER_GID}" "${USER_NAME}"; \
|
|
|
+ fi; \
|
|
|
+ if ! id -u "${USER_NAME}" >/dev/null 2>&1; then \
|
|
|
+ useradd \
|
|
|
+ --uid "${USER_UID}" \
|
|
|
+ --gid "${USER_GID}" \
|
|
|
+ --create-home \
|
|
|
+ --shell /bin/bash \
|
|
|
+ "${USER_NAME}"; \
|
|
|
+ else \
|
|
|
+ usermod --shell /bin/bash "${USER_NAME}"; \
|
|
|
+ fi; \
|
|
|
+ for group in \
|
|
|
+ audio \
|
|
|
+ games \
|
|
|
+ input \
|
|
|
+ render \
|
|
|
+ sudo \
|
|
|
+ tty \
|
|
|
+ video; \
|
|
|
+ do \
|
|
|
+ getent group "${group}" >/dev/null \
|
|
|
+ && usermod -aG "${group}" "${USER_NAME}" \
|
|
|
+ || true; \
|
|
|
+ done; \
|
|
|
+ echo "${USER_NAME} ALL=(ALL:ALL) NOPASSWD: ALL" \
|
|
|
+ > "/etc/sudoers.d/${USER_NAME}"; \
|
|
|
+ chmod 0440 "/etc/sudoers.d/${USER_NAME}"; \
|
|
|
+ install \
|
|
|
+ -d \
|
|
|
+ -o "${USER_UID}" \
|
|
|
+ -g "${USER_GID}" \
|
|
|
+ -m 0700 \
|
|
|
+ /tmp/runtime-ubuntu; \
|
|
|
+ install \
|
|
|
+ -d \
|
|
|
+ -o "${USER_UID}" \
|
|
|
+ -g "${USER_GID}" \
|
|
|
+ /home/${USER_NAME}/.config/sunshine \
|
|
|
+ /games
|
|
|
+
|
|
|
+
|
|
|
+# =============================================================================
|
|
|
+# nvidia-xconfig
|
|
|
+#
|
|
|
+# We only extract the userspace utility. No kernel driver or DKMS is installed
|
|
|
+# in the image; those remain managed by the NVIDIA GPU Operator.
|
|
|
+# =============================================================================
|
|
|
+
|
|
|
+RUN cd /tmp \
|
|
|
+ && curl -fsSLO \
|
|
|
+ "https://international.download.nvidia.com/XFree86/Linux-x86_64/${NVIDIA_DRIVER_VERSION}/NVIDIA-Linux-x86_64-${NVIDIA_DRIVER_VERSION}.run" \
|
|
|
+ && sh \
|
|
|
+ "NVIDIA-Linux-x86_64-${NVIDIA_DRIVER_VERSION}.run" \
|
|
|
+ -x \
|
|
|
+ && install \
|
|
|
+ -m 0755 \
|
|
|
+ "/tmp/NVIDIA-Linux-x86_64-${NVIDIA_DRIVER_VERSION}/nvidia-xconfig" \
|
|
|
+ /usr/local/bin/nvidia-xconfig \
|
|
|
+ && rm -rf /tmp/NVIDIA-Linux-* \
|
|
|
+ && nvidia-xconfig --version
|
|
|
+
|
|
|
+
|
|
|
+# =============================================================================
|
|
|
+# NVIDIA GLVND / Vulkan configuration
|
|
|
+#
|
|
|
+# Actual 64-bit NVIDIA libraries are injected at runtime by the GPU Operator /
|
|
|
+# NVIDIA Container Toolkit.
|
|
|
+# =============================================================================
|
|
|
+
|
|
|
+RUN printf '%s\n' \
|
|
|
+ '/usr/local/nvidia/lib' \
|
|
|
+ '/usr/local/nvidia/lib64' \
|
|
|
+ > /etc/ld.so.conf.d/nvidia.conf \
|
|
|
+ && install -d -m 0755 \
|
|
|
+ /etc/vulkan/icd.d \
|
|
|
+ /usr/share/glvnd/egl_vendor.d \
|
|
|
+ && cat > /etc/vulkan/icd.d/nvidia_icd.json <<'EOF'
|
|
|
+{
|
|
|
+ "file_format_version": "1.0.0",
|
|
|
+ "ICD": {
|
|
|
+ "library_path": "libGLX_nvidia.so.0",
|
|
|
+ "api_version": "1.3.0"
|
|
|
+ }
|
|
|
+}
|
|
|
+EOF
|
|
|
+
|
|
|
+RUN cat > /usr/share/glvnd/egl_vendor.d/10_nvidia.json <<'EOF'
|
|
|
+{
|
|
|
+ "file_format_version": "1.0.0",
|
|
|
+ "ICD": {
|
|
|
+ "library_path": "libEGL_nvidia.so.0"
|
|
|
+ }
|
|
|
+}
|
|
|
+EOF
|
|
|
+
|
|
|
+
|
|
|
+# =============================================================================
|
|
|
+# Sunshine
|
|
|
+# =============================================================================
|
|
|
+
|
|
|
COPY --from=sunshine /sunshine.deb /tmp/sunshine.deb
|
|
|
|
|
|
RUN apt-get update \
|
|
|
- && apt-get install --no-install-recommends -y /tmp/sunshine.deb \
|
|
|
+ && apt-get install --no-install-recommends -y \
|
|
|
+ /tmp/sunshine.deb \
|
|
|
&& rm -f /tmp/sunshine.deb \
|
|
|
&& apt-get clean \
|
|
|
- && rm -rf /var/lib/apt/lists/* /var/cache/apt/*
|
|
|
+ && rm -rf \
|
|
|
+ /var/lib/apt/lists/* \
|
|
|
+ /var/cache/apt/*
|
|
|
|
|
|
-COPY sunshine-entrypoint.sh /etc/sunshine-entrypoint.sh
|
|
|
|
|
|
-RUN sed -i 's/\r$//' /etc/sunshine-entrypoint.sh \
|
|
|
- && chmod 0755 /etc/sunshine-entrypoint.sh
|
|
|
+# =============================================================================
|
|
|
+# Steam + 32-bit Linux gaming runtime
|
|
|
+# =============================================================================
|
|
|
|
|
|
-# Steam / Proton
|
|
|
RUN dpkg --add-architecture i386 \
|
|
|
&& apt-get update \
|
|
|
&& apt-get install --no-install-recommends -y \
|
|
|
@@ -73,9 +293,23 @@ RUN dpkg --add-architecture i386 \
|
|
|
libvulkan1:i386 \
|
|
|
&& rm -f /etc/apt/sources.list.d/steam-bootstrap.list \
|
|
|
&& apt-get clean \
|
|
|
- && rm -rf /var/lib/apt/lists/* /var/cache/apt/*
|
|
|
+ && rm -rf \
|
|
|
+ /var/lib/apt/lists/* \
|
|
|
+ /var/cache/apt/*
|
|
|
+
|
|
|
+
|
|
|
+# =============================================================================
|
|
|
+# NVIDIA 32-bit userspace
|
|
|
+#
|
|
|
+# The GPU Operator currently does not provide the compat32 libraries required
|
|
|
+# by 32-bit OpenGL applications and Proton/DXVK.
|
|
|
+#
|
|
|
+# Install the exact userspace version matching the host driver, then keep a
|
|
|
+# protected copy under /opt. The NVIDIA runtime can remove/mask the files in
|
|
|
+# /usr/lib/i386-linux-gnu when the pod starts; sunshine-entrypoint.sh restores
|
|
|
+# them afterwards.
|
|
|
+# =============================================================================
|
|
|
|
|
|
-# Stack 32bits Nvidia
|
|
|
RUN curl -fsSLO \
|
|
|
https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb \
|
|
|
&& dpkg -i cuda-keyring_1.1-1_all.deb \
|
|
|
@@ -83,41 +317,97 @@ RUN curl -fsSLO \
|
|
|
&& dpkg --add-architecture i386 \
|
|
|
&& apt-get update \
|
|
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
|
|
- libnvidia-common-580=${NVIDIA_DRIVER_PACKAGE_VERSION} \
|
|
|
- libnvidia-gpucomp-580:i386=${NVIDIA_DRIVER_PACKAGE_VERSION} \
|
|
|
- libnvidia-decode-580:i386=${NVIDIA_DRIVER_PACKAGE_VERSION} \
|
|
|
- libnvidia-compute-580:i386=${NVIDIA_DRIVER_PACKAGE_VERSION} \
|
|
|
- libnvidia-gl-580:i386=${NVIDIA_DRIVER_PACKAGE_VERSION} \
|
|
|
+ "libnvidia-common-${NVIDIA_DRIVER_BRANCH}=${NVIDIA_DRIVER_PACKAGE_VERSION}" \
|
|
|
+ "libnvidia-gpucomp-${NVIDIA_DRIVER_BRANCH}:i386=${NVIDIA_DRIVER_PACKAGE_VERSION}" \
|
|
|
+ "libnvidia-decode-${NVIDIA_DRIVER_BRANCH}:i386=${NVIDIA_DRIVER_PACKAGE_VERSION}" \
|
|
|
+ "libnvidia-compute-${NVIDIA_DRIVER_BRANCH}:i386=${NVIDIA_DRIVER_PACKAGE_VERSION}" \
|
|
|
+ "libnvidia-gl-${NVIDIA_DRIVER_BRANCH}:i386=${NVIDIA_DRIVER_PACKAGE_VERSION}" \
|
|
|
&& mkdir -p /opt/nvidia-i386 \
|
|
|
- && for f in $(dpkg -L \
|
|
|
- libnvidia-gl-580:i386 \
|
|
|
- libnvidia-compute-580:i386 \
|
|
|
- libnvidia-decode-580:i386 \
|
|
|
- libnvidia-gpucomp-580:i386 \
|
|
|
- | grep '^/usr/lib/i386-linux-gnu/'); do \
|
|
|
- if [ -e "$f" ] || [ -L "$f" ]; then \
|
|
|
- cp -a --parents "$f" /opt/nvidia-i386/; \
|
|
|
- fi; \
|
|
|
- done \
|
|
|
+ && for file in $( \
|
|
|
+ dpkg -L \
|
|
|
+ "libnvidia-gl-${NVIDIA_DRIVER_BRANCH}:i386" \
|
|
|
+ "libnvidia-compute-${NVIDIA_DRIVER_BRANCH}:i386" \
|
|
|
+ "libnvidia-decode-${NVIDIA_DRIVER_BRANCH}:i386" \
|
|
|
+ "libnvidia-gpucomp-${NVIDIA_DRIVER_BRANCH}:i386" \
|
|
|
+ | grep '^/usr/lib/i386-linux-gnu/' \
|
|
|
+ | sort -u \
|
|
|
+ ); do \
|
|
|
+ if [[ -e "${file}" || -L "${file}" ]]; then \
|
|
|
+ cp -a --parents "${file}" /opt/nvidia-i386/; \
|
|
|
+ fi; \
|
|
|
+ done \
|
|
|
+ && test -e \
|
|
|
+ /opt/nvidia-i386/usr/lib/i386-linux-gnu/libGLX_nvidia.so.0 \
|
|
|
+ && test -e \
|
|
|
+ "/opt/nvidia-i386/usr/lib/i386-linux-gnu/libnvidia-glcore.so.${NVIDIA_DRIVER_VERSION}" \
|
|
|
+ && ldconfig \
|
|
|
&& apt-get clean \
|
|
|
- && rm -rf /var/lib/apt/lists/*
|
|
|
+ && rm -rf \
|
|
|
+ /var/lib/apt/lists/* \
|
|
|
+ /var/cache/apt/*
|
|
|
|
|
|
-USER 1000:1000
|
|
|
|
|
|
-ENV DISPLAY=:20 \
|
|
|
- HOME=/home/ubuntu \
|
|
|
- USER=ubuntu \
|
|
|
- XDG_RUNTIME_DIR=/tmp/runtime-ubuntu \
|
|
|
- PIPEWIRE_RUNTIME_DIR=/tmp/runtime-ubuntu \
|
|
|
- PULSE_RUNTIME_PATH=/tmp/runtime-ubuntu/pulse \
|
|
|
- PULSE_SERVER=unix:/tmp/runtime-ubuntu/pulse/native \
|
|
|
- NVIDIA_VISIBLE_DEVICES=all \
|
|
|
- NVIDIA_DRIVER_CAPABILITIES=all
|
|
|
+# =============================================================================
|
|
|
+# Runtime scripts
|
|
|
+# =============================================================================
|
|
|
+
|
|
|
+COPY desktop-entrypoint.sh /etc/desktop-entrypoint.sh
|
|
|
+COPY sunshine-entrypoint.sh /etc/sunshine-entrypoint.sh
|
|
|
+COPY supervisord.conf /etc/supervisor/supervisord.conf
|
|
|
+
|
|
|
+RUN sed -i 's/\r$//' \
|
|
|
+ /etc/desktop-entrypoint.sh \
|
|
|
+ /etc/sunshine-entrypoint.sh \
|
|
|
+ /etc/supervisor/supervisord.conf \
|
|
|
+ && chmod 0755 \
|
|
|
+ /etc/desktop-entrypoint.sh \
|
|
|
+ /etc/sunshine-entrypoint.sh \
|
|
|
+ && chmod 0644 \
|
|
|
+ /etc/supervisor/supervisord.conf
|
|
|
+
|
|
|
+
|
|
|
+# =============================================================================
|
|
|
+# Final filesystem permissions
|
|
|
+# =============================================================================
|
|
|
+
|
|
|
+RUN chown -R \
|
|
|
+ "${USER_UID}:${USER_GID}" \
|
|
|
+ "/home/${USER_NAME}" \
|
|
|
+ /tmp/runtime-ubuntu
|
|
|
+
|
|
|
+
|
|
|
+# =============================================================================
|
|
|
+# Sanity checks
|
|
|
+# =============================================================================
|
|
|
+
|
|
|
+RUN command -v \
|
|
|
+ steam \
|
|
|
+ && command -v \
|
|
|
+ nvidia-xconfig \
|
|
|
+ && command -v \
|
|
|
+ supervisord \
|
|
|
+ && command -v \
|
|
|
+ pipewire \
|
|
|
+ && command -v \
|
|
|
+ wireplumber \
|
|
|
+ && command -v \
|
|
|
+ Xorg \
|
|
|
+ && command -v \
|
|
|
+ xfce4-session \
|
|
|
+ && test -x \
|
|
|
+ /etc/sunshine-entrypoint.sh \
|
|
|
+ && test -x \
|
|
|
+ /etc/desktop-entrypoint.sh
|
|
|
+
|
|
|
+
|
|
|
+# =============================================================================
|
|
|
+# Runtime
|
|
|
+# =============================================================================
|
|
|
+
|
|
|
+USER 1000:1000
|
|
|
|
|
|
WORKDIR /home/ubuntu
|
|
|
|
|
|
-EXPOSE 47984-47990/tcp
|
|
|
-EXPOSE 48010/tcp
|
|
|
-EXPOSE 47998-48000/udp
|
|
|
+STOPSIGNAL SIGTERM
|
|
|
|
|
|
ENTRYPOINT ["/etc/sunshine-entrypoint.sh"]
|