FROM debian:trixie-slim # Métadonnées LABEL maintainer="jmbatto" LABEL description="Julia 1.10 (Compilé Source) sur Debian Trixie avec PDI/GTK" # Arguments utilisateur (Conservés comme demandé) ARG USER_ID=1001 ARG GROUP_ID=1001 ARG USER_NAME=coder # ----------------------------------------------------------------------------- # 1. Installation des dépendances système (Runtime) # On installe tout ce qu'il faut pour GTK4, PDI et le dev C # ----------------------------------------------------------------------------- RUN apt-get update && apt-get install -y --no-install-recommends \ # Outils de base et compilation C/PDI build-essential cmake git pkg-config \ gfortran \ which \ perl \ gawk \ m4 \ vi \ libatomic1 \ nano sudo lsof gawk emacs jq neowofetch curl wget \ gdb valgrind clang-format \ ca-certificates iputils-ping \ xauth \ iputils-ping \ pkg-config \ colordiff \ mpi-default-dev \ python3 python3-dev python3-numpy \ # Libs scientifiques PDI libhdf5-dev libz-dev \ # X11 & Xvfb (Pour ProfileView headless) libx11-6 libxext6 libxrender1 libxtst6 xauth xvfb dbus-x11 \ # OpenGL Logiciel (Indispensable pour GTK4 dans Docker) libgl1-mesa-dri libgl1 \ # Dépendances GTK4 / Cairo / GDK complètes libgtk-4-1 libgtk-3-0 \ libglib2.0-0 libcairo2 \ libpango-1.0-0 libharfbuzz0b \ libgdk-pixbuf-2.0-0 libgdk-pixbuf2.0-bin \ libgraphene-1.0-0 librsvg2-common \ shared-mime-info \ adwaita-icon-theme-full hicolor-icon-theme fonts-liberation \ graphviz \ patchelf \ && rm -rf /var/lib/apt/lists/* RUN dbus-uuidgen > /etc/machine-id # Fix GDK Pixbuf (Cache des loaders pour éviter les erreurs au runtime) RUN LOADER_PATH=$(find /usr/lib -name gdk-pixbuf-query-loaders | head -n 1) && \ ln -s $LOADER_PATH /usr/bin/gdk-pixbuf-query-loaders && \ gdk-pixbuf-query-loaders --update-cache # Version cible # ARG JULIA_VERSION=v1.10.10 ARG JULIA_VERSION=v1.12.4 WORKDIR /tmp/julia-build # On utilise --depth 1 pour accélérer le téléchargement (évite le timeout) RUN git clone --depth 1 --branch ${JULIA_VERSION} https://github.com/JuliaLang/julia.git . RUN echo "prefix=/usr/local/julia" > Make.user && \ echo "MARCH=x86-64" >> Make.user && \ echo "USE_SYSTEM_LIBUNWIND=0" >> Make.user && \ # echo "USE_BINARYBUILDER=0" >> Make.user && \ echo "LDFLAGS=-Wl,-z,noexecstack" >> Make.user && \ echo "CFLAGS=-Wa,--noexecstack -gdwarf-4" >> Make.user && \ echo "CXXFLAGS=-Wa,--noexecstack -gdwarf-4" >> Make.user # ----------------------------------------------------------------------------- # 2. COMPILATION DE JULIA # ----------------------------------------------------------------------------- # Mise à jour du PATH ENV JULIA_PATH=/usr/local/julia ENV PATH=$JULIA_PATH/bin:$PATH # Compilation RUN make -j$(nproc) && \ make install # ----------------------------------------------------------------------------- # 3. Installation de PDI (Build from source) # Configuration PDI # ----------------------------------------------------------------------------- ENV PDI_DIR=/usr/local ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/lib/x86_64-linux-gnu ENV CPATH=/usr/local/include ENV PREFIX=/usr/local WORKDIR /tmp/pdi-build RUN git clone --depth 1 https://github.com/pdidev/pdi.git . && \ mkdir build && cd build && \ cmake \ -DBUILD_MPI=OFF \ -DBUILD_DECL_HDF5_PLUGIN=ON \ -DBUILD_SHARED_LIBS=ON \ -DBUILD_FORTRAN=OFF \ -DBUILD_HDF5_PARALLEL=OFF \ -DBUILD_PYTHON=ON \ -DBUILD_PYCALL_PLUGIN=ON \ -DBUILD_NETCDF_PARALLEL=OFF \ -DCMAKE_INSTALL_PREFIX=/usr/local \ .. && \ make -j$(nproc) && \ make install && \ ldconfig && \ cd / && rm -rf /tmp/pdi-build # ----------------------------------------------------------------------------- # 4. Pré-installation des paquets Julia # On utilise xvfb-run pour que ProfileView/Gtk puissent se précompiler sans écran physique. # ----------------------------------------------------------------------------- #RUN echo "Application du patch 'clear-execstack' sur les librairies Julia..." && \ # find $JULIA_PATH -name "libopenlibm.so" -exec patchelf --clear-execstack {} \; && \ # # On applique aussi sur libjulia-internal par sécurité # find $JULIA_PATH -name "libjulia-internal.so*" -exec patchelf --clear-execstack {} \; && \ # find $JULIA_PATH -type f -name "*.so*" -exec patchelf --clear-execstack {} \; ENV LD_LIBRARY_PATH=/usr/local/julia/lib:/usr/local/julia/lib/julia:/usr/local/lib:/usr/lib/x86_64-linux-gnu ENV GKSwstype=100 ENV JULIA_PKG_PRECOMPILE_AUTO=0 ENV JULIA_PKG_USE_CLI_GIT=true RUN julia -e 'import Pkg; \ Pkg.add([ \ "HDF5"])' RUN xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24 -nolisten tcp" \ julia -e 'import Pkg; \ Pkg.add([ \ # "Plots", \ "DataFrames", \ "Gtk4", \ "Gtk", \ "ProfileView", \ "PProf", \ "Reexport" \ ])' # ÉTAPE B : ACTION CORRECTIVE CRITIQUE # Pkg.add a téléchargé des artifacts (.so) qui violent la sécurité execstack. # On doit les patcher AVANT que Julia ne tente de les charger pour la précompilation. #RUN echo "Patching des artifacts téléchargés dans .julia..." && \ # find /root/.julia -name "*.so*" -exec patchelf --clear-execstack {} \; ENV LD_LIBRARY_PATH="" # ÉTAPE C : Précompilation (Maintenant c'est sûr) # On utilise xvfb-run car Gtk/ProfileView ont besoin d'un serveur X, même virtuel. RUN xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24 -nolisten tcp" \ julia -e 'import Pkg; Pkg.precompile()' ENV LD_LIBRARY_PATH=/usr/local/julia/lib:/usr/local/julia/lib/julia:/usr/local/lib:/usr/lib/x86_64-linux-gnu # ----------------------------------------------------------------------------- # 5. Création de l'utilisateur (Structure décomposée conservée) # ----------------------------------------------------------------------------- RUN groupadd -g ${GROUP_ID} ${USER_NAME} && \ useradd -m -u ${USER_ID} -g ${USER_NAME} -s /bin/bash ${USER_NAME} && \ echo "${USER_NAME} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers USER ${USER_NAME} WORKDIR /home/${USER_NAME}/project ENV DISPLAY=host.docker.internal:0.0 CMD ["/bin/bash"]