Pārlūkot izejas kodu

suppression de selkies

penta 1 mēnesi atpakaļ
vecāks
revīzija
c0feea26f7
1 mainītis faili ar 337 papildinājumiem un 47 dzēšanām
  1. 337 47
      Dockerfile

+ 337 - 47
Dockerfile

@@ -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"]