Dockerfile 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. FROM debian:trixie-slim
  2. # an image with OpenMPI4.1, used without root privileges for sshd
  3. # XMP and telegraf
  4. # ------------------------------------------------------------
  5. # Do basic install
  6. # ------------------------------------------------------------
  7. RUN apt-get update \
  8. && mkdir -p /usr/share/man/man1 \
  9. && apt-get install -y --no-install-recommends gcc ssh wget vim curl net-tools bison flex openjdk-21-jdk-headless autoconf make \
  10. && apt-get install -y libtool m4 automake bzip2 libxml2 libxml2-dev gfortran g++ iputils-ping pkg-config colordiff \
  11. && apt-get install -y nano git sudo lsof gawk emacs jq neowofetch \
  12. && apt-get install -y libtdl* astyle cmake gdb strace binutils-dev dnsutils \
  13. && apt-get install -y netcat-traditional libgomp1 googletest supervisor munge libmunge2 libmunge-dev mariadb-server libmariadb-dev gnupg psmisc bash-completion libhttp-parser-dev libjson-c-dev libntirpc-dev libpmix-dev libpmix2 libpmi2-0-dev dbus \
  14. && adduser --uid 1001 --home /home/mpiuser --shell /bin/bash \
  15. --disabled-password --gecos '' mpiuser \
  16. && passwd -d mpiuser \
  17. && apt-get install -y openssh-server \
  18. && mkdir -p /run/sshd /home/mpiuser/.ssh /home/mpiuser/.ssh-source \
  19. && echo "StrictHostKeyChecking no" > /home/mpiuser/.ssh/config \
  20. && chown -R mpiuser /home/mpiuser \
  21. && sed -i s/#PermitRootLogin.*/PermitRootLogin\ no/ /etc/ssh/sshd_config \
  22. && sed -i s/#PubkeyAuthentication.*/PubkeyAuthentication\ no/ /etc/ssh/sshd_config \
  23. && sed -i s/.*UsePAM.*/UsePAM\ no/ /etc/ssh/sshd_config \
  24. && sed -i s/#PasswordAuthentication.*/PasswordAuthentication\ yes/ /etc/ssh/sshd_config \
  25. && sed -i s/#PermitEmptyPasswords.*/PermitEmptyPasswords\ yes/ /etc/ssh/sshd_config \
  26. && sed -i s/#ChallengeResponse.*/ChallengeResponseAuthentication\ no/ /etc/ssh/sshd_config \
  27. && sed -i s/#PermitUserEnvironment.*/PermitUserEnvironment\ yes/ /etc/ssh/sshd_config \
  28. && adduser mpiuser sudo \
  29. && apt-get clean \
  30. && rm -rf /var/lib/apt/lists/*
  31. ENV PREFIX=/usr/local \
  32. DEBCONF_NOWARNINGS=yes \
  33. OPENMPI_VERSION=4.1.8 \
  34. LD_LIBRARY_PATH=/usr/local/lib \
  35. USE_SLURMDBD=true \
  36. CLUSTER_NAME=linux \
  37. CONTROL_MACHINE=slurmctld \
  38. SLURMCTLD_PORT=6817 \
  39. SLURMD_PORT=6818 \
  40. ACCOUNTING_STORAGE_HOST=slurmdbd \
  41. ACCOUNTING_STORAGE_PORT=6819 \
  42. PARTITION_NAME=docker
  43. # ------------------------------------------------------------
  44. # Install OpenMPI 4.1
  45. # https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.8.tar.gz
  46. # ------------------------------------------------------------
  47. # OpenMPI v4.1
  48. RUN repo="https://download.open-mpi.org/release/open-mpi/v4.1" \
  49. && curl --location --silent --show-error --output openmpi.tar.gz \
  50. "${repo}/openmpi-${OPENMPI_VERSION}.tar.gz" \
  51. && tar xzf openmpi.tar.gz -C /tmp/ \
  52. && cd /tmp/openmpi-${OPENMPI_VERSION} \
  53. && env CFLAGS="-O2 -std=gnu99 -fopenmp" \
  54. && ./configure --prefix=${PREFIX} --with-pmi=/usr --with-pmi-libdir=/usr/lib/x86_64-linux-gnu \
  55. && make \
  56. && make install \
  57. && ldconfig \
  58. && cd / \
  59. && rm -rf /tmp/openmpi-${OPENMPI_VERSION} /home/mpiuser/openmpi.tar.gz
  60. # ------------------------------------------------------------
  61. # Add some parameters for MPI, mpishare - a folder shared through the nodes
  62. # ------------------------------------------------------------
  63. RUN mkdir -p /usr/local/var/mpishare
  64. RUN chown -R 1001:1001 /usr/local/var/mpishare
  65. RUN echo "mpiuser ALL=(ALL) NOPASSWD:ALL\n" >> /etc/sudoers
  66. RUN rm -fr /home/mpiuser/.openmpi && mkdir -p /home/mpiuser/.openmpi
  67. RUN cd /home/mpiuser/.openmpi \
  68. && echo "btl = tcp,self \n" \
  69. "btl_tcp_if_include = eth0 \n" \
  70. "plm_rsh_no_tree_spawn = 1 \n" >> default-mca-params.conf
  71. RUN chown -R 1001:1001 /home/mpiuser/.openmpi
  72. RUN echo "rmaps_base_oversubscribe = 1\n" >> /usr/local/etc/openmpi-mca-params.conf
  73. RUN echo "rmaps_base_inherit = 1\n" >> /usr/local/etc/openmpi-mca-params.conf
  74. # ------------------------------------------------------------
  75. # Start mpi python install / user mpiuser
  76. # ------------------------------------------------------------
  77. RUN apt-get update \
  78. && apt-get install -y --no-install-recommends python3-minimal python3-pip python3-fissix \
  79. && apt-get clean && apt-get purge && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
  80. # Installer l'outil pour créer des environnements virtuels
  81. RUN apt-get update && apt-get install -y python3-venv
  82. RUN mkdir -p /opt/venv
  83. RUN chown -R mpiuser:mpiuser /opt/venv
  84. # in order to have python related to mpiuser account
  85. USER mpiuser
  86. # Créer et activer l'environnement virtuel (dans le même RUN)
  87. RUN python3 -m venv /opt/venv
  88. ENV PATH="/opt/venv/bin:$PATH"
  89. RUN pip install setuptools --break-system-packages \
  90. && pip install mpi4py --break-system-packages --no-cache-dir --force-reinstall \
  91. && pip install 2to3
  92. USER root
  93. # ------------------------------------------------------------
  94. # Load omni-compiler 1.3.4 from a public repo
  95. # ------------------------------------------------------------
  96. RUN mkdir -p /home/mpiuser/YMLEnvironment
  97. WORKDIR /home/mpiuser/YMLEnvironment
  98. RUN wget --no-check-certificate --content-disposition https://omni-compiler.org/download/stable/omnicompiler-1.3.4.tar.bz2 \
  99. && bunzip2 omnicompiler-1.3.4.tar.bz2 \
  100. && tar xvf omnicompiler-1.3.4.tar \
  101. && rm /home/mpiuser/YMLEnvironment/omnicompiler-1.3.4.tar
  102. # ------------------------------------------------------------
  103. # Install omnicompiler-1.3.4 : requested javac
  104. # ------------------------------------------------------------
  105. WORKDIR /home/mpiuser/YMLEnvironment/omnicompiler-1.3.4
  106. RUN cd /home/mpiuser/YMLEnvironment/omnicompiler-1.3.4 \
  107. && export FCFLAGS="-w -fallow-argument-mismatch -O2" \
  108. && export FFLAGS="-w -fallow-argument-mismatch -O2" \
  109. && export MPI_FCFLAGS="-fopenmp -fallow-argument-mismatch -O2" \
  110. && export CPPFLAGS="-fallow-argument-mismatch -DOMNI_CPU_X86_64 -DOMNI_OS_LINUX -DGNU_SOURCE -D_REENTRANT" \
  111. && ./configure --prefix=${PREFIX} --with-libxml2=/usr \
  112. && make && make install && make clean && ldconfig
  113. # ------------------------------------------------------------
  114. # Install test-spawn-xmp
  115. # ------------------------------------------------------------
  116. USER mpiuser
  117. COPY test-spawn-xmp /home/mpiuser/YMLEnvironment/test-spawn-xmp
  118. USER root
  119. RUN chown -R mpiuser:mpiuser /home/mpiuser/YMLEnvironment
  120. # ------------------------------------------------------------
  121. # The .ssh-source dir contains RSA keys - put in place with docker-compose
  122. # ------------------------------------------------------------
  123. RUN touch /home/mpiuser/.ssh-source/authorized_keys
  124. RUN touch /home/mpiuser/.ssh-source/id_rsa
  125. # ------------------------------------------------------------
  126. # Do SSHd parameter to enable slurm to run it
  127. # ------------------------------------------------------------
  128. RUN sed -i s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation\ no/ /etc/ssh/sshd_config
  129. RUN mkdir -p /home/mpiuser/ssh
  130. RUN ssh-keygen -q -N "" -t rsa -b 4096 -f /home/mpiuser/ssh/ssh_host_rsa_key \
  131. && ssh-keygen -q -N "" -t ecdsa -f /home/mpiuser/ssh/ssh_host_ecdsa_key \
  132. && ssh-keygen -q -N "" -t ed25519 -f /home/mpiuser/ssh/ssh_host_ed25519_key
  133. RUN cp /etc/ssh/sshd_config /home/mpiuser/ssh/
  134. RUN sed -i s/#HostKey\ \\/etc\\/ssh/HostKey\ \\/home\\/mpiuser\\/ssh/ /home/mpiuser/ssh/sshd_config
  135. RUN sed -i s/#PidFile\ \\/var\\/run/PidFile\ \\/home\\/mpiuser\\/ssh/ /home/mpiuser/ssh/sshd_config
  136. RUN sed -i s/#LogLevel.*/LogLevel\ DEBUG3/ /home/mpiuser/ssh/sshd_config
  137. RUN sed -i s/PubkeyAuthentication\ no/PubkeyAuthentication\ yes/ /home/mpiuser/ssh/sshd_config
  138. RUN chown -R mpiuser:mpiuser /home/mpiuser/ssh
  139. ARG SLURM_TAG=slurm-23-02-6-1
  140. ARG JOBS=4
  141. ARG GOSU_VERSION=1.17
  142. RUN set -ex \
  143. && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-amd64" \
  144. && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-amd64.asc" \
  145. && export GNUPGHOME="$(mktemp -d)" \
  146. && gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
  147. && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
  148. && rm -rf "${GNUPGHOME}" /usr/local/bin/gosu.asc \
  149. && chmod +x /usr/local/bin/gosu \
  150. && gosu nobody true
  151. RUN set -x \
  152. && git clone -b ${SLURM_TAG} --single-branch --depth=1 https://github.com/SchedMD/slurm.git \
  153. && cd slurm \
  154. && ./configure --enable-debug --prefix=/usr --sysconfdir=/etc/slurm \
  155. --with-mysql_config=/usr/bin --libdir=/usr/lib64 \
  156. && make install \
  157. && install -D -m644 etc/cgroup.conf.example /etc/slurm/cgroup.conf.example \
  158. && install -D -m644 etc/slurm.conf.example /etc/slurm/slurm.conf.example \
  159. && install -D -m644 etc/slurmdbd.conf.example /etc/slurm/slurmdbd.conf.example \
  160. && install -D -m644 contribs/slurm_completion_help/slurm_completion.sh /etc/profile.d/slurm_completion.sh \
  161. && cd .. \
  162. && rm -rf slurm \
  163. && groupadd -r --gid=990 slurm \
  164. && useradd -r -g slurm --uid=990 slurm \
  165. && mkdir -p /etc/sysconfig/slurm \
  166. /var/spool/slurmd \
  167. /var/run/slurmd \
  168. /var/run/slurmdbd \
  169. /var/lib/slurmd \
  170. /var/log/slurm \
  171. /data \
  172. && touch /var/lib/slurmd/node_state \
  173. /var/lib/slurmd/front_end_state \
  174. /var/lib/slurmd/job_state \
  175. /var/lib/slurmd/resv_state \
  176. /var/lib/slurmd/trigger_state \
  177. /var/lib/slurmd/assoc_mgr_state \
  178. /var/lib/slurmd/assoc_usage \
  179. /var/lib/slurmd/qos_usage \
  180. /var/lib/slurmd/fed_mgr_state \
  181. && chown -R slurm:slurm /var/*/slurm*
  182. # RUN /usr/sbin/create-munge-key
  183. RUN dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key
  184. RUN chown munge: /etc/munge/munge.key
  185. RUN chmod 400 /etc/munge/munge.key
  186. RUN mkdir -p /var/run/munge
  187. RUN chown -R munge: /etc/munge/ /var/log/munge/ /var/lib/munge/ /run/munge/
  188. RUN chmod 0700 /etc/munge/ /var/log/munge/ /var/lib/munge/
  189. RUN chmod 755 /run/munge
  190. # ------------------------------------------------------------
  191. # Install telegraf
  192. # ------------------------------------------------------------
  193. RUN apt-get update && apt-get install -y --no-install-recommends gpgv ca-certificates apt-transport-https gnupg lsb-release
  194. # RUN wget -qO- https://repos.influxdata.com/influxdb.key | apt-key add -
  195. RUN wget -qO- https://repos.influxdata.com/influxdb.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdb.gpg > /dev/null
  196. RUN export DISTRIB_ID=$(lsb_release -si); export DISTRIB_CODENAME=$(lsb_release -sc) \
  197. && echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg] https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list > /dev/null
  198. RUN curl -fsSL https://repos.influxdata.com/influxdata-archive_compat.key -o /etc/apt/keyrings/influxdata-archive_compat.key
  199. RUN echo "deb [signed-by=/etc/apt/keyrings/influxdata-archive_compat.key] https://repos.influxdata.com/debian stable main" | tee /etc/apt/sources.list.d/influxdata.list
  200. RUN apt-get update && apt-get install -y --no-install-recommends telegraf && apt-get clean && apt-get purge && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
  201. # ------------------------------------------------------------
  202. # The .ssh-source dir contains RSA keys - put in place with docker-compose
  203. # ------------------------------------------------------------
  204. RUN touch /home/mpiuser/.ssh-source/authorized_keys
  205. RUN touch /home/mpiuser/.ssh-source/id_rsa
  206. # ------------------------------------------------------------
  207. # supervisord to run entrypoint
  208. # ------------------------------------------------------------
  209. COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
  210. # ------------------------------------------------------------
  211. # telegraf to run entrypoint
  212. # ------------------------------------------------------------
  213. COPY telegraf.conf /etc/telegraf/telegraf.conf
  214. EXPOSE 22 80 8125
  215. WORKDIR /home/mpiuser
  216. # trixie force le ssl pour mysql
  217. RUN echo "[client]\nssl=0" > /etc/my.cnf
  218. COPY slurm.conf /etc/slurm/slurm.conf
  219. COPY slurmdbd.conf /etc/slurm/slurmdbd.conf
  220. COPY cgroup.conf /etc/slurm/cgroup.conf
  221. RUN set -x \
  222. && chown slurm:slurm /etc/slurm/slurmdbd.conf \
  223. && chmod 600 /etc/slurm/slurmdbd.conf
  224. COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
  225. CMD cp -R /home/mpiuser/.ssh-source/* /home/mpiuser/.ssh \
  226. && chmod 700 /home/mpiuser/.ssh/authorized_keys \
  227. && chmod 700 /home/mpiuser/.ssh/id_rsa \
  228. && chown -R mpiuser:mpiuser /home/mpiuser/.ssh \
  229. && exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
  230. # && exec /usr/sbin/sshd -D -f /home/mpiuser/ssh/sshd_config -E /tmp/sshd.log
  231. # do not detach (-D), log to stderr (-e)
  232. # CMD ["/usr/sbin/sshd", "-D", "-e"]