Dockerfile 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. FROM debian:trixie-slim
  2. # Métadonnées
  3. LABEL maintainer="jmbatto"
  4. LABEL description="Julia 1.10 (Compilé Source) sur Debian Trixie avec PDI/GTK"
  5. # Arguments utilisateur (Conservés comme demandé)
  6. ARG USER_ID=1001
  7. ARG GROUP_ID=1001
  8. ARG USER_NAME=coder
  9. # -----------------------------------------------------------------------------
  10. # 1. Installation des dépendances système (Runtime)
  11. # On installe tout ce qu'il faut pour GTK4, PDI et le dev C
  12. # -----------------------------------------------------------------------------
  13. RUN apt-get update && apt-get install -y --no-install-recommends \
  14. # Outils de base et compilation C/PDI
  15. build-essential cmake git pkg-config \
  16. gfortran \
  17. which \
  18. perl \
  19. gawk \
  20. m4 \
  21. vi \
  22. libatomic1 \
  23. nano sudo lsof gawk emacs jq neowofetch curl wget \
  24. gdb valgrind clang-format \
  25. ca-certificates iputils-ping \
  26. xauth \
  27. iputils-ping \
  28. pkg-config \
  29. colordiff \
  30. mpi-default-dev \
  31. python3 python3-dev python3-numpy \
  32. # Libs scientifiques PDI
  33. libhdf5-dev libz-dev \
  34. # X11 & Xvfb (Pour ProfileView headless)
  35. libx11-6 libxext6 libxrender1 libxtst6 xauth xvfb dbus-x11 \
  36. # OpenGL Logiciel (Indispensable pour GTK4 dans Docker)
  37. libgl1-mesa-dri libgl1 \
  38. # Dépendances GTK4 / Cairo / GDK complètes
  39. libgtk-4-1 libgtk-3-0 \
  40. libglib2.0-0 libcairo2 \
  41. libpango-1.0-0 libharfbuzz0b \
  42. libgdk-pixbuf-2.0-0 libgdk-pixbuf2.0-bin \
  43. libgraphene-1.0-0 librsvg2-common \
  44. shared-mime-info \
  45. adwaita-icon-theme-full hicolor-icon-theme fonts-liberation \
  46. graphviz \
  47. patchelf \
  48. && rm -rf /var/lib/apt/lists/*
  49. RUN dbus-uuidgen > /etc/machine-id
  50. # Fix GDK Pixbuf (Cache des loaders pour éviter les erreurs au runtime)
  51. RUN LOADER_PATH=$(find /usr/lib -name gdk-pixbuf-query-loaders | head -n 1) && \
  52. ln -s $LOADER_PATH /usr/bin/gdk-pixbuf-query-loaders && \
  53. gdk-pixbuf-query-loaders --update-cache
  54. # Version cible
  55. # ARG JULIA_VERSION=v1.10.10
  56. ARG JULIA_VERSION=v1.12.4
  57. WORKDIR /tmp/julia-build
  58. # On utilise --depth 1 pour accélérer le téléchargement (évite le timeout)
  59. RUN git clone --depth 1 --branch ${JULIA_VERSION} https://github.com/JuliaLang/julia.git .
  60. RUN echo "prefix=/usr/local/julia" > Make.user && \
  61. echo "MARCH=x86-64" >> Make.user && \
  62. echo "USE_SYSTEM_LIBUNWIND=0" >> Make.user && \
  63. # echo "USE_BINARYBUILDER=0" >> Make.user && \
  64. echo "LDFLAGS=-Wl,-z,noexecstack" >> Make.user && \
  65. echo "CFLAGS=-Wa,--noexecstack -gdwarf-4" >> Make.user && \
  66. echo "CXXFLAGS=-Wa,--noexecstack -gdwarf-4" >> Make.user
  67. # -----------------------------------------------------------------------------
  68. # 2. COMPILATION DE JULIA
  69. # -----------------------------------------------------------------------------
  70. # Mise à jour du PATH
  71. ENV JULIA_PATH=/usr/local/julia
  72. ENV PATH=$JULIA_PATH/bin:$PATH
  73. # Compilation
  74. RUN make -j$(nproc) && \
  75. make install
  76. # -----------------------------------------------------------------------------
  77. # 3. Installation de PDI (Build from source)
  78. # Configuration PDI
  79. # -----------------------------------------------------------------------------
  80. ENV PDI_DIR=/usr/local
  81. ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/lib/x86_64-linux-gnu
  82. ENV CPATH=/usr/local/include
  83. ENV PREFIX=/usr/local
  84. WORKDIR /tmp/pdi-build
  85. RUN git clone --depth 1 https://github.com/pdidev/pdi.git . && \
  86. mkdir build && cd build && \
  87. cmake \
  88. -DBUILD_MPI=OFF \
  89. -DBUILD_DECL_HDF5_PLUGIN=ON \
  90. -DBUILD_SHARED_LIBS=ON \
  91. -DBUILD_FORTRAN=OFF \
  92. -DBUILD_HDF5_PARALLEL=OFF \
  93. -DBUILD_PYTHON=ON \
  94. -DBUILD_PYCALL_PLUGIN=ON \
  95. -DBUILD_NETCDF_PARALLEL=OFF \
  96. -DCMAKE_INSTALL_PREFIX=/usr/local \
  97. .. && \
  98. make -j$(nproc) && \
  99. make install && \
  100. ldconfig && \
  101. cd / && rm -rf /tmp/pdi-build
  102. # -----------------------------------------------------------------------------
  103. # 4. Pré-installation des paquets Julia
  104. # On utilise xvfb-run pour que ProfileView/Gtk puissent se précompiler sans écran physique.
  105. # -----------------------------------------------------------------------------
  106. #RUN echo "Application du patch 'clear-execstack' sur les librairies Julia..." && \
  107. # find $JULIA_PATH -name "libopenlibm.so" -exec patchelf --clear-execstack {} \; && \
  108. # # On applique aussi sur libjulia-internal par sécurité
  109. # find $JULIA_PATH -name "libjulia-internal.so*" -exec patchelf --clear-execstack {} \; && \
  110. # find $JULIA_PATH -type f -name "*.so*" -exec patchelf --clear-execstack {} \;
  111. ENV LD_LIBRARY_PATH=/usr/local/julia/lib:/usr/local/julia/lib/julia:/usr/local/lib:/usr/lib/x86_64-linux-gnu
  112. ENV GKSwstype=100
  113. ENV JULIA_PKG_PRECOMPILE_AUTO=0
  114. ENV JULIA_PKG_USE_CLI_GIT=true
  115. RUN julia -e 'import Pkg; \
  116. Pkg.add([ \
  117. "HDF5"])'
  118. RUN xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24 -nolisten tcp" \
  119. julia -e 'import Pkg; \
  120. Pkg.add([ \
  121. # "Plots", \
  122. "DataFrames", \
  123. "Gtk4", \
  124. "Gtk", \
  125. "ProfileView", \
  126. "PProf", \
  127. "Reexport" \
  128. ])'
  129. # ÉTAPE B : ACTION CORRECTIVE CRITIQUE
  130. # Pkg.add a téléchargé des artifacts (.so) qui violent la sécurité execstack.
  131. # On doit les patcher AVANT que Julia ne tente de les charger pour la précompilation.
  132. #RUN echo "Patching des artifacts téléchargés dans .julia..." && \
  133. # find /root/.julia -name "*.so*" -exec patchelf --clear-execstack {} \;
  134. ENV LD_LIBRARY_PATH=""
  135. # ÉTAPE C : Précompilation (Maintenant c'est sûr)
  136. # On utilise xvfb-run car Gtk/ProfileView ont besoin d'un serveur X, même virtuel.
  137. RUN xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24 -nolisten tcp" \
  138. julia -e 'import Pkg; Pkg.precompile()'
  139. ENV LD_LIBRARY_PATH=/usr/local/julia/lib:/usr/local/julia/lib/julia:/usr/local/lib:/usr/lib/x86_64-linux-gnu
  140. # -----------------------------------------------------------------------------
  141. # 5. Création de l'utilisateur (Structure décomposée conservée)
  142. # -----------------------------------------------------------------------------
  143. RUN groupadd -g ${GROUP_ID} ${USER_NAME} && \
  144. useradd -m -u ${USER_ID} -g ${USER_NAME} -s /bin/bash ${USER_NAME} && \
  145. echo "${USER_NAME} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
  146. USER ${USER_NAME}
  147. WORKDIR /home/${USER_NAME}/project
  148. ENV DISPLAY=host.docker.internal:0.0
  149. CMD ["/bin/bash"]