diff --git a/docker/Dockerfile-mini b/docker/Dockerfile-mini new file mode 100644 index 0000000..756d509 --- /dev/null +++ b/docker/Dockerfile-mini @@ -0,0 +1,67 @@ +FROM ubuntu:22.04 + +SHELL ["/bin/bash", "-c"] + +USER root +ENV DEBIAN_FRONTEND=noninteractive + +# Build tools + minimal Python +RUN apt-get update -y && apt-get install -y \ + python3 python3-dev python3-pip \ + cmake g++ gcc binutils \ + libssl-dev wget git \ + && rm -rf /var/lib/apt/lists/* + +RUN python3 -m pip install --upgrade pip && \ + python3 -m pip install numpy pandas uproot awkward plotly ipython && \ + ln -sf /usr/bin/python3 /usr/bin/python + +# Geant4 v11.1.2 — batch mode only (no visualization, no multithreading) +RUN wget -q https://gitlab.cern.ch/geant4/geant4/-/archive/v11.1.2/geant4-v11.1.2.tar.gz && \ + tar -xzf geant4-v11.1.2.tar.gz -C /tmp && \ + rm geant4-v11.1.2.tar.gz && \ + mkdir /tmp/geant4-v11.1.2-build && \ + cmake \ + -S /tmp/geant4-v11.1.2 \ + -B /tmp/geant4-v11.1.2-build \ + -DCMAKE_INSTALL_PREFIX=/opt/geant4-v11.1.2 \ + -DCMAKE_RULE_MESSAGES=OFF \ + -DGEANT4_INSTALL_DATA=ON \ + -DGEANT4_BUILD_MULTITHREADED=OFF \ + -DGEANT4_BUILD_TLS_MODEL=global-dynamic \ + > /dev/null && \ + cmake --build /tmp/geant4-v11.1.2-build --parallel $(nproc) > /dev/null && \ + cmake --install /tmp/geant4-v11.1.2-build > /dev/null && \ + rm -rf /tmp/geant4-v11.1.2 /tmp/geant4-v11.1.2-build + +ENV LD_LIBRARY_PATH="/opt/geant4-v11.1.2/lib:${LD_LIBRARY_PATH}" + +# Build minicalo +ARG BUILD_DATE +ARG COMMIT +ARG USER +LABEL org.label-schema.build-date=$BUILD_DATE + +ADD minicalosim /root/minicalosim + +RUN cd /root/minicalosim && git checkout $COMMIT && \ + git submodule update --init && \ + cmake \ + -S . -B build \ + -DWITH_GEANT4_UIVIS=OFF \ + > /dev/null && \ + cmake --build build --parallel $(nproc) && \ + cp build/minicalo*.so /usr/local/lib/python3.10/dist-packages/ + +RUN cp /root/minicalosim/bind/G4Calo.py \ + /root/minicalosim/bind/minicalo_tools.py \ + /root/minicalosim/bind/minipandas.py \ + /usr/local/lib/python3.10/dist-packages/ && \ + install -m 755 /root/minicalosim/bind/G4Calo_exec.py /usr/local/bin/G4Calo_exec.py + +# Copy examples +RUN cp -r /root/minicalosim/bind /examples && \ + rm -rf /root/minicalosim + +WORKDIR /examples +CMD ["bash"] diff --git a/docker/build_mini.sh b/docker/build_mini.sh new file mode 100755 index 0000000..3cd5f08 --- /dev/null +++ b/docker/build_mini.sh @@ -0,0 +1,74 @@ +#!/usr/bin/bash + +if [ -n "$1" ]; then + if [ "$1" == "--no-cache" ]; then + FORCE_NO_CACHE="--no-cache" + COMMIT=$(git rev-parse --short HEAD) + else + COMMIT=$1 + if ! git cat-file -e $COMMIT^{commit} 2>/dev/null; then + echo "ERROR: Commit $COMMIT not found in local repository." + exit 1 + fi + fi +else + COMMIT=$(git rev-parse --short HEAD) +fi + +if [ "$COMMIT" == "$(git rev-parse --short HEAD)" ]; then + if [ -n "$(git status --porcelain)" ]; then + echo "WARNING: You are building the latest commit ${COMMIT}, but you have uncommitted changes." + echo " This means that the image will not be reproducible." + echo " If you want to build the latest commit, please commit your changes first." + read -p "Do you want to continue anyway? [y/N] " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi + fi +fi + +check_remote_commit_exists() { + local url="$1" + local commit="$2" + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + git -C "$tmpdir" init -q + git -C "$tmpdir" remote add origin "$url" + if git -C "$tmpdir" fetch --quiet --depth=1 origin "$commit" 2>/dev/null; then + echo "✅ Commit $commit exists on remote." + return 0 + else + echo "❌ ERROR: Commit $commit not found on remote." + echo "Refs currently visible on remote:" + git ls-remote --heads --tags "$url" + return 1 + fi +} + +if ! check_remote_commit_exists https://github.com/jkiesele/minicalosim $COMMIT; then + echo "WARNING: Commit $COMMIT not found in remote repository." +fi + +if [ "$2" == "--no-cache" ]; then + FORCE_NO_CACHE="--no-cache" +fi + +cd "$(dirname "$0")" +cd ../../ +echo "Building minicalosim-mini:$COMMIT" +echo "Current working directory: $(pwd)" + +docker build $FORCE_NO_CACHE \ + -t jkiesele/minicalosim-mini:$COMMIT \ + --build-arg USER=$USER \ + --build-arg BUILD_DATE="$(date)" \ + --build-arg COMMIT=$COMMIT \ + -f minicalosim/docker/Dockerfile-mini . + +echo "successfully built container jkiesele/minicalosim-mini:${COMMIT}" + +docker tag jkiesele/minicalosim-mini:$COMMIT jkiesele/minicalosim-mini:latest + +echo "also tagged as jkiesele/minicalosim-mini:latest"