Generated Dockerfiles
The generated Dockerfiles for all images are shown below.
- Alternatively, download a tarball of the Dockerfiles and contexts
- See also the image specification YAML
Note
Patch files, which are applied with git apply commands, are found in the git-repository's patches/ directory. This directory is copied to /build/patches at image build time.
base Dockerfile
Dockerfile.base
#syntax=docker/dockerfile:1
ARG BASE_NAME=archlinux
ARG BASE_TAG=latest
FROM ${BASE_NAME}:${BASE_TAG}
ARG IMAGE_NAME=base
ARG NTHREADS=4
ARG CMAKE_BUILD_TYPE=Release
ARG MESON_BUILD_TYPE=release
ARG USER_NAME=clas12user
ARG GROUP_NAME=clas12user
ARG USER_ID=10001
ARG GROUP_ID=10001
LABEL name=$IMAGE_NAME
LABEL maintainer="Christopher Dilks"
LABEL architecture="amd64"
USER root
# CA certificates
ADD https://pki.jlab.org/JLabCA.crt /tmp/JLabCA.crt
RUN trust anchor --store /tmp/JLabCA.crt && rm /tmp/JLabCA.crt
# define user
RUN groupadd \
--gid ${GROUP_ID}\
${GROUP_NAME} && \
useradd \
--no-log-init \
--create-home \
--shell /usr/sbin/bash \
--uid ${USER_ID} \
--gid ${GROUP_ID} \
${USER_NAME}
# context
RUN mkdir -p /opt
COPY entrypoint /opt/entrypoint
COPY bin/memmon /usr/local/bin/
COPY bin/container_info /usr/local/bin/
# include info about this image
COPY images.yaml /usr/local/etc/
COPY info.yaml /usr/local/etc/
# pacman mirror configuration
COPY etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist
# include patches
COPY patches /build/patches
# databases
COPY *.sqlite /usr/share/clasdb/
RUN ls -lh /usr/share/clasdb/
# dump runner specs
RUN spec() { echo "::::: $@ :::::" && $@ ; } && \
echo '=== CONTROLLED LIMITS ========' && \
echo "CPU: JL_RUNNER_AVAIL_CPU=${JL_RUNNER_AVAIL_CPU-} threads" && \
echo "MEM: JL_RUNNER_AVAIL_MEM=${JL_RUNNER_AVAIL_MEM-} bytes" && \
echo '=== FULL RUNNER SPECS ========' && \
spec nproc && \
spec lscpu && \
spec free -m && \
echo '=== CGROUPS DETAILS ==========' && \
spec cat /sys/fs/cgroup/cpu.max && \
echo " (ncpu: divide the first number by the second)" && \
spec cat /sys/fs/cgroup/memory.max && \
echo " (units: bytes)" && \
echo '=============================='
# system update, before anything
RUN pacman -Syu --noconfirm
# system configuration
# NOTE: using `w /dev/stdout` in `sed -i` calls to print what gets replaced to `stdout`
RUN echo '=============== system configuration ===============' && \
echo '>>> set locale, by uncommenting the relevant locale line' && \
sed -i -e '/en_US\.UTF-8/ s;^#;;g w /dev/stdout' /etc/locale.gen && \
echo '>>> regenerate locales' && \
locale-gen && \
echo '>>> allow man pages to be installed, by commenting out the relevant `NoExtract` line' && \
sed -i -e '/^\<NoExtract\>.*\<man\>/ s;^;#; w /dev/stdout' /etc/pacman.conf && \
echo '>>> install manpage for pacman' && \
pacman -S --noconfirm pacman && \
echo '=============== done system configuration ==============='
# `/usr/local` is not in all default search paths
# - already included by default in `$PATH`
# - everything else uses the following env vars:
ENV CMAKE_PREFIX_PATH=/usr/local
ENV LD_LIBRARY_PATH=/usr/local/lib
ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
ENV PYTHONPATH=/usr/local/python
ENV ROOT_INCLUDE_PATH=/usr/local/include
# install upstream packages with pacman
# NOTE: the pacman cache is cleared afterward to minimize image size
RUN pacman -Syu --noconfirm && \
pacman -S --noconfirm --needed \
bash \
bc \
binutils \
clang \
cmake \
curl \
davix \
diffutils \
emacs-nox \
expac \
fish \
fmt \
fzf \
gcc-fortran \
gcc \
git-lfs \
git \
glew \
glu \
gradle \
groovy \
gsl \
inetutils \
jdk21-openjdk \
jq \
libx11 \
libxext \
libxft \
libxpm \
llvm \
make \
man-db \
man-pages \
mariadb-clients \
maven \
meson \
nano \
ncdu \
ninja \
nvim \
openssl \
patch \
pkgconf \
plocate \
python-pip \
python-sqlalchemy \
python \
ripgrep \
rsync \
ruby \
scons \
sqlite \
tcsh \
tree \
vim \
wget \
which \
xorg-server-xvfb \
xorg-xeyes \
yq \
zsh && \
yes | pacman -Scc
# create a python virtual environment, for packages not from the Linux package repo
RUN python -m venv --system-site-packages /opt/venv
ENV VIRTUAL_ENV=/opt/venv
ENV PATH=$VIRTUAL_ENV/bin:$PATH
# make a temporary build directory; all build instructions below should
# assume this is the current working directory
WORKDIR /build
# install asprof, version 4.2 (ref 'v4.2')
RUN git clone \
--depth 1 \
--single-branch \
--branch v4.2 \
https://github.com/async-profiler/async-profiler.git && \
cd async-profiler && \
git apply /build/patches/asprof/v4.2.patch && \
make -j $NTHREADS && \
install -t /usr/local/lib ./build/lib/* && \
install -t /usr/local/bin ./build/bin/*
# install rcdb, version 1.99.7 (ref '8f797c632f1891b5efd8fc331e1ccf7a4cf7911c')
ENV RCDB_HOME=/opt/rcdb
ENV RCDB_CONNECTION=sqlite:////usr/share/clasdb/rcdb_latest.sqlite
ENV PATH=$RCDB_HOME/bin:$PATH
ENV PYTHONPATH=$RCDB_HOME/python:$PYTHONPATH
RUN git clone \
--revision 8f797c632f1891b5efd8fc331e1ccf7a4cf7911c \
https://code.jlab.org/hallb/clas12/rcdb.git \
$RCDB_HOME
# install ccdb, version 1.99.6 (ref '1.99.6')
ENV CCDB_HOME=/usr/local
ENV CCDB_CONNECTION=sqlite:////usr/share/clasdb/ccdb_latest.sqlite
RUN git clone \
--depth 1 \
--single-branch \
--branch 1.99.6 \
https://code.jlab.org/hallb/clas12/ccdb.git && \
cmake -S ccdb -B ccdb_build --install-prefix $CCDB_HOME && \
cmake --build ccdb_build -j $NTHREADS && \
cmake --install ccdb_build
# install qadb, version 3.4.1 (ref 'v3.4.1')
# NOTE: this is the only repo that uses JYPATH (for coatjava's `run-groovy`)
ENV QADB=/opt/clas12-qadb
ENV JYPATH=$QADB/src
ENV PATH=$QADB/bin:$PATH
RUN git clone \
--depth 1 \
--single-branch \
--branch v3.4.1 \
https://github.com/JeffersonLab/clas12-qadb.git \
--recurse-submodules \
--shallow-submodules \
$QADB
# install hipo, version 4.3.0 (ref '4.3.0')
ENV HIPO=/usr/local
RUN git clone \
--depth 1 \
--single-branch \
--branch 4.3.0 \
https://code.jlab.org/hallb/clas12/hipo-cpp.git && \
meson setup hipo-cpp/build hipo-cpp \
--prefix=$HIPO \
-D buildtype=$MESON_BUILD_TYPE \
&& \
meson compile -C hipo-cpp/build -j $NTHREADS && \
meson install -C hipo-cpp/build
# cleanup
WORKDIR /home/${USER_NAME}
RUN rm -rf /build
# remove .git directories, leftover from `git clone` to `/opt/`
RUN find /opt -type d -name .git | xargs -I{} sh -c 'echo "REMOVING {}" && rm -rf {}'
# update plocate DB
RUN updatedb
# set entrypoint
CMD ["/usr/sbin/bash", "--rcfile", "/opt/entrypoint/bashrc"]
# switch back to non-root user
USER ${USER_NAME}
base_root Dockerfile
Dockerfile.base_root
#syntax=docker/dockerfile:1
ARG BASE_NAME=base
ARG BASE_TAG=latest
FROM ${BASE_NAME}:${BASE_TAG}
ARG IMAGE_NAME=base_root
ARG NTHREADS=4
ARG NTHREADS_ROOT=3
ARG CMAKE_BUILD_TYPE=Release
ARG MESON_BUILD_TYPE=release
LABEL name=$IMAGE_NAME
LABEL maintainer="Christopher Dilks"
LABEL architecture="amd64"
# switch from non-root user to root
RUN user_name=$(whoami)
USER root
# include patches
COPY patches /build/patches
# include info about this image
COPY info.yaml /usr/local/etc/
# dump runner specs
RUN spec() { echo "::::: $@ :::::" && $@ ; } && \
echo '=== CONTROLLED LIMITS ========' && \
echo "CPU: JL_RUNNER_AVAIL_CPU=${JL_RUNNER_AVAIL_CPU-} threads" && \
echo "MEM: JL_RUNNER_AVAIL_MEM=${JL_RUNNER_AVAIL_MEM-} bytes" && \
echo '=== FULL RUNNER SPECS ========' && \
spec nproc && \
spec lscpu && \
spec free -m && \
echo '=== CGROUPS DETAILS ==========' && \
spec cat /sys/fs/cgroup/cpu.max && \
echo " (ncpu: divide the first number by the second)" && \
spec cat /sys/fs/cgroup/memory.max && \
echo " (units: bytes)" && \
echo '=============================='
# make a temporary build directory; all build instructions below should
# assume this is the current working directory
WORKDIR /build
# install root, version 6.36.06 (ref 'v6-36-06')
# prefer to isolate its installation, so we can more clearly see CLAS12-software in /usr/local
ENV ROOTSYS=/opt/root
ENV PATH=$ROOTSYS/bin:$PATH
ENV LD_LIBRARY_PATH=$ROOTSYS/lib:$LD_LIBRARY_PATH
ENV PYTHONPATH=$ROOTSYS/lib:$PYTHONPATH
ENV CMAKE_PREFIX_PATH=$ROOTSYS:$CMAKE_PREFIX_PATH
RUN git clone \
--depth 1 \
--single-branch \
--branch v6-36-06 \
https://github.com/root-project/root.git \
root && \
cmake -S root -B root_build \
--install-prefix $ROOTSYS \
-D CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE \
-D fftw3=ON \
-D mathmore=ON \
-D proof=ON \
&& \
memmon 1 cmake --build root_build -j $NTHREADS_ROOT && \
cmake --install root_build
# install hipo, version 4.3.0 (ref '4.3.0')
ENV HIPO=/usr/local
RUN git clone \
--depth 1 \
--single-branch \
--branch 4.3.0 \
https://code.jlab.org/hallb/clas12/hipo-cpp.git && \
meson setup hipo-cpp/build hipo-cpp \
--prefix=$HIPO \
-D buildtype=$MESON_BUILD_TYPE \
&& \
meson compile -C hipo-cpp/build -j $NTHREADS && \
meson install -C hipo-cpp/build
# cleanup
WORKDIR /home/$user_name
RUN rm -rf /build
# remove .git directories, leftover from `git clone` to `/opt/`
RUN find /opt -type d -name .git | xargs -I{} sh -c 'echo "REMOVING {}" && rm -rf {}'
# update plocate DB
RUN updatedb
# switch back to non-root user
USER $user_name
base_root_debug Dockerfile
Dockerfile.base_root_debug
#syntax=docker/dockerfile:1
ARG BASE_NAME=base
ARG BASE_TAG=latest
FROM ${BASE_NAME}:${BASE_TAG}
ARG IMAGE_NAME=base_root_debug
ARG NTHREADS=4
ARG NTHREADS_ROOT=3
ARG CMAKE_BUILD_TYPE=Release
ARG MESON_BUILD_TYPE=release
LABEL name=$IMAGE_NAME
LABEL maintainer="Christopher Dilks"
LABEL architecture="amd64"
# switch from non-root user to root
RUN user_name=$(whoami)
USER root
# include patches
COPY patches /build/patches
# include info about this image
COPY info.yaml /usr/local/etc/
# dump runner specs
RUN spec() { echo "::::: $@ :::::" && $@ ; } && \
echo '=== CONTROLLED LIMITS ========' && \
echo "CPU: JL_RUNNER_AVAIL_CPU=${JL_RUNNER_AVAIL_CPU-} threads" && \
echo "MEM: JL_RUNNER_AVAIL_MEM=${JL_RUNNER_AVAIL_MEM-} bytes" && \
echo '=== FULL RUNNER SPECS ========' && \
spec nproc && \
spec lscpu && \
spec free -m && \
echo '=== CGROUPS DETAILS ==========' && \
spec cat /sys/fs/cgroup/cpu.max && \
echo " (ncpu: divide the first number by the second)" && \
spec cat /sys/fs/cgroup/memory.max && \
echo " (units: bytes)" && \
echo '=============================='
# make a temporary build directory; all build instructions below should
# assume this is the current working directory
WORKDIR /build
# install root, version 6.36.06 (ref 'v6-36-06')
# prefer to isolate its installation, so we can more clearly see CLAS12-software in /usr/local
ENV ROOTSYS=/opt/root
ENV PATH=$ROOTSYS/bin:$PATH
ENV LD_LIBRARY_PATH=$ROOTSYS/lib:$LD_LIBRARY_PATH
ENV PYTHONPATH=$ROOTSYS/lib:$PYTHONPATH
ENV CMAKE_PREFIX_PATH=$ROOTSYS:$CMAKE_PREFIX_PATH
RUN git clone \
--depth 1 \
--single-branch \
--branch v6-36-06 \
https://github.com/root-project/root.git \
root && \
cmake -S root -B root_build \
--install-prefix $ROOTSYS \
-D CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE \
-D fftw3=ON \
-D mathmore=ON \
-D proof=ON \
&& \
memmon 1 cmake --build root_build -j $NTHREADS_ROOT && \
cmake --install root_build
# install hipo, version 4.3.0 (ref '4.3.0')
ENV HIPO=/usr/local
RUN git clone \
--depth 1 \
--single-branch \
--branch 4.3.0 \
https://code.jlab.org/hallb/clas12/hipo-cpp.git && \
meson setup hipo-cpp/build hipo-cpp \
--prefix=$HIPO \
-D buildtype=$MESON_BUILD_TYPE \
&& \
meson compile -C hipo-cpp/build -j $NTHREADS && \
meson install -C hipo-cpp/build
# cleanup
WORKDIR /home/$user_name
RUN rm -rf /build
# remove .git directories, leftover from `git clone` to `/opt/`
RUN find /opt -type d -name .git | xargs -I{} sh -c 'echo "REMOVING {}" && rm -rf {}'
# update plocate DB
RUN updatedb
# switch back to non-root user
USER $user_name
analysis Dockerfile
Dockerfile.analysis
#syntax=docker/dockerfile:1
ARG BASE_NAME=base_root
ARG BASE_TAG=latest
FROM ${BASE_NAME}:${BASE_TAG}
ARG IMAGE_NAME=analysis
ARG NTHREADS=4
ARG NTHREADS_ROOT=3
ARG CMAKE_BUILD_TYPE=Release
ARG MESON_BUILD_TYPE=release
LABEL name=$IMAGE_NAME
LABEL maintainer="Christopher Dilks"
LABEL architecture="amd64"
# switch from non-root user to root
RUN user_name=$(whoami)
USER root
# include patches
COPY patches /build/patches
# include info about this image
COPY info.yaml /usr/local/etc/
# dump runner specs
RUN spec() { echo "::::: $@ :::::" && $@ ; } && \
echo '=== CONTROLLED LIMITS ========' && \
echo "CPU: JL_RUNNER_AVAIL_CPU=${JL_RUNNER_AVAIL_CPU-} threads" && \
echo "MEM: JL_RUNNER_AVAIL_MEM=${JL_RUNNER_AVAIL_MEM-} bytes" && \
echo '=== FULL RUNNER SPECS ========' && \
spec nproc && \
spec lscpu && \
spec free -m && \
echo '=== CGROUPS DETAILS ==========' && \
spec cat /sys/fs/cgroup/cpu.max && \
echo " (ncpu: divide the first number by the second)" && \
spec cat /sys/fs/cgroup/memory.max && \
echo " (units: bytes)" && \
echo '=============================='
# install upstream packages with pacman
# NOTE: the pacman cache is cleared afterward to minimize image size
RUN pacman -Syu --noconfirm && \
pacman -S --noconfirm --needed \
python-awkward \
python-matplotlib \
python-numpy \
python-pandas \
python-seaborn \
python-uproot \
python-vector \
yaml-cpp && \
yes | pacman -Scc
# make a temporary build directory; all build instructions below should
# assume this is the current working directory
WORKDIR /build
# install clara, version main (ref 'main')
ENV CLARA_HOME=/opt/clara-home
ENV PATH=$CLARA_HOME/bin:$PATH
RUN git clone \
--depth 1 \
--single-branch \
--branch main \
https://code.jlab.org/hallb/clas12/clara-java.git && \
cd clara-java && \
./gradlew deploy
# install clas12-config, version main (ref 'main')
RUN git clone \
--depth 1 \
--single-branch \
--branch main \
https://github.com/JeffersonLab/clas12-config.git \
/opt/clas12-config
# install clas12root, version 1.9.0 (ref '1.9.0')
ENV CLAS12ROOT=/opt/clas12root
ENV PATH=$CLAS12ROOT/bin:$PATH
ENV LD_LIBRARY_PATH=$CLAS12ROOT/lib:$LD_LIBRARY_PATH
ENV ROOT_INCLUDE_PATH=$CLAS12ROOT/Clas12Root:$CLAS12ROOT/Clas12Banks:$ROOT_INCLUDE_PATH
RUN git clone \
--depth 1 \
--single-branch \
--branch 1.9.0 \
https://github.com/JeffersonLab/clas12root.git \
$CLAS12ROOT && \
cd $CLAS12ROOT && \
./installC12Root
# install coatjava, version 13.5.1 (ref '13.5.1')
ENV COATJAVA=/opt/coatjava
ENV CLAS12DIR=/opt/coatjava
ENV PATH=$COATJAVA/bin:$PATH
RUN git clone \
--depth 1 \
--single-branch \
--branch 13.5.1 \
https://github.com/JeffersonLab/coatjava.git && \
cd coatjava && \
./build-coatjava.sh --lfs --data -T $NTHREADS && \
cd validation/advanced-tests && \
./run-eb-tests.sh electronproton && \
./run-eb-tests.sh electrongamma && \
./run-eb-tests.sh electronprotonC && \
./run-eb-tests.sh electronneutronC && \
./run-eb-tests.sh electronFTpion && \
cd - && \
mv coatjava /opt/ && \
mv validation/advanced-tests/out_*.hipo /opt/coatjava/etc/data/test
# install iguana, version 1.1.0 (ref 'v1.1.0')
# NOTE: environment variable IGUANA is only needed for clas12root
ENV IGUANA=/usr/local
ENV IGUANA_CONFIG_PATH=$IGUANA/etc/iguana
RUN git clone \
--depth 1 \
--single-branch \
--branch v1.1.0 \
https://github.com/JeffersonLab/iguana.git && \
meson setup iguana/build iguana \
--prefix=$IGUANA \
-D buildtype=release \
-D bind_fortran=true \
-D bind_python=true \
-D install_examples=true \
-D z_install_envfile=false \
-D z_require_root=true \
-D rcdb:home=$RCDB_HOME \
&& \
meson compile -C iguana/build -j $NTHREADS && \
meson install -C iguana/build
# install hipopy, version 2.0.1 (ref 'v2.0.1')
RUN python -m pip install hipopy==v2.0.1
# cleanup
WORKDIR /home/$user_name
RUN rm -rf /build
# remove .git directories, leftover from `git clone` to `/opt/`
RUN find /opt -type d -name .git | xargs -I{} sh -c 'echo "REMOVING {}" && rm -rf {}'
# update plocate DB
RUN updatedb
# switch back to non-root user
USER $user_name
simulation Dockerfile
Dockerfile.simulation
#syntax=docker/dockerfile:1
ARG BASE_NAME=base_root
ARG BASE_TAG=latest
FROM ${BASE_NAME}:${BASE_TAG}
ARG IMAGE_NAME=simulation
ARG NTHREADS=4
ARG NTHREADS_ROOT=3
ARG CMAKE_BUILD_TYPE=Release
ARG MESON_BUILD_TYPE=release
LABEL name=$IMAGE_NAME
LABEL maintainer="Christopher Dilks"
LABEL architecture="amd64"
# switch from non-root user to root
RUN user_name=$(whoami)
USER root
# include patches
COPY patches /build/patches
# include info about this image
COPY info.yaml /usr/local/etc/
# dump runner specs
RUN spec() { echo "::::: $@ :::::" && $@ ; } && \
echo '=== CONTROLLED LIMITS ========' && \
echo "CPU: JL_RUNNER_AVAIL_CPU=${JL_RUNNER_AVAIL_CPU-} threads" && \
echo "MEM: JL_RUNNER_AVAIL_MEM=${JL_RUNNER_AVAIL_MEM-} bytes" && \
echo '=== FULL RUNNER SPECS ========' && \
spec nproc && \
spec lscpu && \
spec free -m && \
echo '=== CGROUPS DETAILS ==========' && \
spec cat /sys/fs/cgroup/cpu.max && \
echo " (ncpu: divide the first number by the second)" && \
spec cat /sys/fs/cgroup/memory.max && \
echo " (units: bytes)" && \
echo '=============================='
# install upstream packages with pacman
# NOTE: the pacman cache is cleared afterward to minimize image size
RUN pacman -Syu --noconfirm && \
pacman -S --noconfirm --needed \
boost \
onetbb \
openmotif \
qt5-base \
qt5-tools \
soqt \
xerces-c && \
yes | pacman -Scc
# make a temporary build directory; all build instructions below should
# assume this is the current working directory
WORKDIR /build
# install clas12-mcgen, version 3.18 (ref '65b3fbfa824cd58f9d04d7b631da99ee250e4779')
# NOTE: the Makefile is not thread safe, see <https://github.com/JeffersonLab/clas12-mcgen/issues/48>
# common env
ENV MCGEN_HOME=/opt/mcgen
ENV PATH=$MCGEN_HOME/bin:$PATH
ENV LD_LIBRARY_PATH=$MCGEN_HOME:$LD_LIBRARY_PATH
# generators
ENV TCSGEN_DIR=$MCGEN_HOME/TCSGen
ENV CLASDIS_PDF=$MCGEN_HOME/clasdis/pdf/
ENV CLASPYTHIA_DECLIST=$MCGEN_HOME/claspyth/
ENV CLASDVCS_PDF=$MCGEN_HOME/dvcsgen
ENV DataKYandOnePion=$MCGEN_HOME/genKYandOnePion/data
ENV DISRAD_PDF=$MCGEN_HOME/inclusive-dis-rad/xgrid
ENV TWOPEG_DATA_DIR=$MCGEN_HOME/twopeg
ENV C12ELSPECTRO=$MCGEN_HOME/clas12-elSpectro
ENV ELSPECTRO=$MCGEN_HOME/clas12-elSpectro/elSpectro
ENV MCEGENpiN_radcorr_path=$MCGEN_HOME/MCEGENpiN_radcorr
ENV CLAS_PARMS=$MCGEN_HOME/onepigen
ENV GENEPI=$MCGEN_HOME/genepi
ENV GENIE=$MCGEN_HOME/genie
ENV GIBUU=$MCGEN_HOME/gibuu
# pythia
ENV PYTHIA8DATA=$MCGEN_HOME/share/Pythia8/xmldoc
# lhapdf
ENV LHAPDF_DATA_PATH=$MCGEN_HOME/share/LHAPDF/
# elspectro headers
ENV ROOT_INCLUDE_PATH=$ELSPECTRO/core:$ROOT_INCLUDE_PATH
ENV ROOT_INCLUDE_PATH=$ELSPECTRO/jpacPhoto/include:$ROOT_INCLUDE_PATH
ENV ROOT_INCLUDE_PATH=$ELSPECTRO/jpacPhoto/include/amplitudes:$ROOT_INCLUDE_PATH
# build and install
RUN git clone \
--revision 65b3fbfa824cd58f9d04d7b631da99ee250e4779 \
--recurse-submodules https://github.com/jeffersonlab/clas12-mcgen.git $MCGEN_HOME && \
cd $MCGEN_HOME && \
make && \
make install && \
make slim
# install clhep, version 2.4.7.2 (ref 'CLHEP_2_4_7_2')
ENV CLHEP_VERSION=2.4.7.2
ENV CLHEP_BASE_DIR=/opt/clhep
ENV CLHEP_DIR=$CLHEP_BASE_DIR
ENV LD_LIBRARY_PATH=$CLHEP_BASE_DIR/lib:$LD_LIBRARY_PATH
ENV PKG_CONFIG_PATH=$CLHEP_BASE_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
RUN git clone \
--depth 1 \
--single-branch \
--branch CLHEP_2_4_7_2 \
https://gitlab.cern.ch/CLHEP/CLHEP.git && \
cmake -B clhep-build -S CLHEP \
--install-prefix $CLHEP_BASE_DIR \
-D BUILD_STATIC_LIBS=ON \
-D CLHEP_BUILD_DOCS=OFF \
-D CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE \
-D CMAKE_POSITION_INDEPENDENT_CODE=ON \
&& \
echo "[+] Building clhep..." && \
cmake --build clhep-build -j $NTHREADS > /dev/null && \
echo "[+] Installing clhep..." && \
cmake --install clhep-build > /dev/null
# install geant4, version 10.7.4 (ref 'v10.7.4')
# NOTE: silenced `stdout` from `cmake`, to avoid surpassing CI runner log limits
ENV G4_VERSION=10.7.4
ENV G4INSTALL=/opt/Geant4/Geant4
ENV G4DATA_DIR=/opt/Geant4/Libraries
ENV G4LIB=$G4INSTALL/lib
ENV PATH=$G4INSTALL/bin:$PATH
ENV LD_LIBRARY_PATH=$G4LIB:$LD_LIBRARY_PATH
ENV PKG_CONFIG_PATH=$G4LIB/pkgconfig:$PKG_CONFIG_PATH
ENV CMAKE_PREFIX_PATH=$G4INSTALL:$CMAKE_PREFIX_PATH
RUN git clone \
--depth 1 \
--single-branch \
--branch v10.7.4 \
https://github.com/Geant4/geant4.git && \
cd geant4 && \
git apply /build/patches/geant4/v10.7.4.patch.1 && \
git apply /build/patches/geant4/v10.7.4.patch.2 && \
git apply /build/patches/geant4/v10.7.4.patch.3 && \
cmake -B build -S . \
--install-prefix $G4INSTALL \
-D BUILD_STATIC_LIBS=ON \
-D CLHEP_ROOT_DIR=$CLHEP_BASE_DIR \
-D CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE \
-D CMAKE_POLICY_VERSION_MINIMUM=4.0 \
-D CMAKE_POSITION_INDEPENDENT_CODE=ON \
-D GEANT4_BUILD_BUILTIN_BACKTRACE=OFF \
-D GEANT4_BUILD_MULTITHREADED=ON \
-D GEANT4_INSTALL_DATA=ON \
-D GEANT4_INSTALL_DATADIR=$G4DATA_DIR \
-D GEANT4_INSTALL_PACKAGE_CACHE=ON \
-D GEANT4_USE_GDML=ON \
-D GEANT4_USE_OPENGL_X11=ON \
-D GEANT4_USE_QT=ON \
-D GEANT4_USE_RAYTRACER_X11=ON \
-D GEANT4_USE_SYSTEM_EXPAT=ON \
-D GEANT4_USE_SYSTEM_ZLIB=ON \
&& \
echo "[+] Building geant4..." && \
cmake --build build -j $NTHREADS > /dev/null && \
echo "[+] Installing geant4..." && \
cmake --install build > /dev/null
# geant4 data environment variables
# NOTE: copied from $G4INSTALL/bin/geant4.sh
# - depends on the geant4 version
# - prefer hard-coded `ENV` instructions to make sure they are set now,
# otherwise we'd need to `source geant4.sh` every time they're needed
RUN cat $G4INSTALL/bin/geant4.sh
ENV G4NEUTRONHPDATA=$G4DATA_DIR/G4NDL4.6
ENV G4LEDATA=$G4DATA_DIR/G4EMLOW7.13
ENV G4LEVELGAMMADATA=$G4DATA_DIR/PhotonEvaporation5.7
ENV G4RADIOACTIVEDATA=$G4DATA_DIR/RadioactiveDecay5.6
ENV G4PARTICLEXSDATA=$G4DATA_DIR/G4PARTICLEXS3.1.1
ENV G4PIIDATA=$G4DATA_DIR/G4PII1.3
ENV G4REALSURFACEDATA=$G4DATA_DIR/RealSurface2.2
ENV G4SAIDXSDATA=$G4DATA_DIR/G4SAIDDATA2.0
ENV G4ABLADATA=$G4DATA_DIR/G4ABLA3.1
ENV G4INCLDATA=$G4DATA_DIR/G4INCL1.0
ENV G4ENSDFSTATEDATA=$G4DATA_DIR/G4ENSDFSTATE2.3
# verify the directories exist
RUN for d in \
$G4NEUTRONHPDATA \
$G4LEDATA \
$G4LEVELGAMMADATA \
$G4RADIOACTIVEDATA \
$G4PARTICLEXSDATA \
$G4PIIDATA \
$G4REALSURFACEDATA \
$G4SAIDXSDATA \
$G4ABLADATA \
$G4INCLDATA \
$G4ENSDFSTATEDATA \
; do \
if [ ! -d "$d" ]; then \
echo "ERROR: geant4 data env var set to nonexistent dir '$d'"; \
exit 1; \
fi; \
done
# install clas12-cmag, version 1.1 (ref 'v1.1')
ENV CMAG_VERSION=1.1
ENV CLAS12_CMAG=/opt/cmag
ENV C12BFIELDS=$CLAS12_CMAG
ENV PATH=$CLAS12_CMAG/bin:$PATH
ENV LD_LIBRARY_PATH=$CLAS12_CMAG/lib:$LD_LIBRARY_PATH
RUN git clone \
--depth 1 \
--single-branch \
--branch v1.1 \
https://github.com/JeffersonLab/clas12-cmag.git $CLAS12_CMAG && \
cd $CLAS12_CMAG && \
git apply /build/patches/clas12-cmag/v1.1.patch && \
make -C src -j $NTHREADS
# install scons_bm, version 1.14 (ref 'a177f194fe9494316cd26a9eed70f21714314fef')
# NOTE: env var `QTDIR` must point to the system QT installation
# NOTE: env var `XERCESCROOT` must point to the system xerces-c installation
ENV SCONS_BM_VERSION=1.14
ENV SCONS_BM=/opt/scons_bm
ENV SCONSFLAGS=--site-dir=$SCONS_BM
ENV PYTHONPATH=$SCONS_BM:$PYTHONPATH
ENV QTDIR=/usr
ENV XERCESCROOT=/usr
RUN git clone \
--revision a177f194fe9494316cd26a9eed70f21714314fef \
https://github.com/maureeungaro/scons_bm.git $SCONS_BM
# install mlibrary, version 1.9 (ref 'cf4b5069b2ab0aebef9fe676a25c73850112e658')
ENV MLIBRARY_VERSION=1.9
ENV MLIBRARY=/opt/mlibrary
ENV LD_LIBRARY_PATH=$MLIBRARY/lib:$LD_LIBRARY_PATH
# build cadmesh first
RUN git clone \
--revision cf4b5069b2ab0aebef9fe676a25c73850112e658 \
https://github.com/gemc/mlibrary.git $MLIBRARY && \
cd $MLIBRARY && \
git apply /build/patches/mlibrary/cf4b5069b2ab0aebef9fe676a25c73850112e658.patch && \
cmake -B cadmesh-build -S cadmesh \
--install-prefix $MLIBRARY \
-D CMAKE_POLICY_VERSION_MINIMUM=3.5 \
&& \
echo "[+] Building cadmesh..." && \
cmake --build cadmesh-build -j $NTHREADS > /dev/null && \
echo "[+] Installing cadmesh..." && \
cmake --install cadmesh-build > /dev/null && \
cp -r cadmesh-build/lib/* lib/ && \
rm -rf cadmesh-build
# then build mlibrary
RUN cd $MLIBRARY && \
scons -j $NTHREADS SHOWENV=1 && \
rm -f .sconsign.dblite && \
find . -name "*.o" -delete
# install magfield, version ceInstall@3f0f87364e7f1552bef5cc1255afbf6deba34936 (ref '3f0f87364e7f1552bef5cc1255afbf6deba34936')
# NOTE: using `ceInstall` to get all the field maps, rather than the LFS repo,
# which currently only has production maps
ENV FIELD_DIR=/opt/magfield
RUN git clone \
--revision 3f0f87364e7f1552bef5cc1255afbf6deba34936 \
https://github.com/JeffersonLab/ceInstall.git && \
ceInstall/install/install_fields
# install gemc, version 5.12 (ref '5.12')
ENV GEMC_VERSION=5.12
ENV GEMC=/opt/gemc
ENV GEMC_DATA_DIR=$GEMC
ENV PATH=$GEMC/bin:$PATH
ENV PATH=$GEMC/api:$PATH
ENV LD_LIBRARY_PATH=$GEMC/lib:$LD_LIBRARY_PATH
ENV PKG_CONFIG_PATH=$GEMC/lib/pkgconfig:$PKG_CONFIG_PATH
ENV PYTHONPATH=$GEMC/api:$PYTHONPATH
RUN git clone \
--depth 1 \
--single-branch \
--branch 5.12 \
https://github.com/gemc/clas12Tags.git $GEMC && \
cd $GEMC/source && \
scons -j $NTHREADS && \
mkdir -p $GEMC/bin && \
mv gemc $GEMC/bin && \
mv lib $GEMC/ && \
rm -f .sconsign.dblite && \
find ./ -name "*.o" -delete
# cleanup
WORKDIR /home/$user_name
RUN rm -rf /build
# remove .git directories, leftover from `git clone` to `/opt/`
RUN find /opt -type d -name .git | xargs -I{} sh -c 'echo "REMOVING {}" && rm -rf {}'
# update plocate DB
RUN updatedb
# switch back to non-root user
USER $user_name