Warning, /eic-opticks/Dockerfile is written in an unsupported language. File is not indexed.
0001 # syntax=docker/dockerfile:latest
0002
0003 ARG OS=ubuntu24.04
0004 ARG CUDA_VERSION=13.0.3
0005 ARG OPTIX_VERSION=9.0.0
0006 ARG GEANT4_VERSION=11.4.2
0007 ARG CMAKE_VERSION=4.2.1
0008 ARG PYTHON_VERSION=3.13
0009 ARG SPACK_BUILDCACHE_MIRROR=oci://ghcr.io/bnlnpps/simphony-spack-buildcache
0010 ARG SPACK_TARGET=x86_64_v2
0011
0012 FROM nvidia/cuda:${CUDA_VERSION}-devel-${OS} AS base
0013
0014 ARG OPTIX_VERSION
0015 ARG GEANT4_VERSION
0016 ARG CMAKE_VERSION
0017 ARG PYTHON_VERSION
0018 ARG CMAKE_BUILD_JOBS
0019
0020 ENV DEBIAN_FRONTEND=noninteractive
0021
0022 RUN apt update \
0023 && apt install -y g++ gcc gzip tar python3 python-is-python3 python3-pip curl git \
0024 && apt clean \
0025 && rm -rf /var/lib/apt/lists/*
0026
0027 RUN apt update \
0028 && apt install -y nlohmann-json3-dev \
0029 libglu1-mesa-dev libxmu-dev libglm-dev \
0030 libxkbcommon-dev \
0031 qt6-base-dev libxerces-c-dev libexpat1-dev \
0032 && apt clean \
0033 && rm -rf /var/lib/apt/lists/*
0034
0035 RUN curl -fsSL https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-x86_64.tar.gz \
0036 | tar -xz --strip-components=1 -C /usr/local
0037
0038 RUN mkdir -p /opt/clhep/src && curl -sL https://gitlab.cern.ch/CLHEP/CLHEP/-/archive/CLHEP_2_4_7_2/CLHEP-CLHEP_2_4_7_2.tar.gz | tar -xz --strip-components 1 -C /opt/clhep/src \
0039 && cmake -S /opt/clhep/src -B /opt/clhep/build \
0040 && cmake --build /opt/clhep/build --parallel "${CMAKE_BUILD_JOBS:-$(nproc)}" --target install \
0041 && rm -fr /opt/clhep
0042
0043 RUN mkdir -p /opt/geant4/src && curl -sL https://github.com/Geant4/geant4/archive/refs/tags/v${GEANT4_VERSION}.tar.gz | tar -xz --strip-components 1 -C /opt/geant4/src \
0044 && cmake -S /opt/geant4/src -B /opt/geant4/build -DGEANT4_USE_SYSTEM_CLHEP=ON -DGEANT4_USE_OPENGL_X11=ON -DGEANT4_USE_QT=ON -DGEANT4_USE_QT_QT6=ON -DGEANT4_USE_GDML=ON -DGEANT4_INSTALL_DATA=ON -DGEANT4_BUILD_MULTITHREADED=ON \
0045 && cmake --build /opt/geant4/build --parallel "${CMAKE_BUILD_JOBS:-$(nproc)}" --target install \
0046 && rm -fr /opt/geant4
0047
0048 RUN mkdir -p /opt/plog/src && curl -sL https://github.com/SergiusTheBest/plog/archive/refs/tags/1.1.11.tar.gz | tar -xz --strip-components 1 -C /opt/plog/src \
0049 && cmake -S /opt/plog/src -B /opt/plog/build \
0050 && cmake --build /opt/plog/build --parallel "${CMAKE_BUILD_JOBS:-$(nproc)}" --target install \
0051 && rm -fr /opt/plog
0052
0053 RUN mkdir -p /opt/optix && curl -sL https://github.com/NVIDIA/optix-dev/archive/refs/tags/v${OPTIX_VERSION}.tar.gz | tar -xz --strip-components 1 -C /opt/optix
0054
0055 RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh
0056
0057 ENV UV_PYTHON=${PYTHON_VERSION}
0058 ENV UV_MANAGED_PYTHON=1
0059
0060 SHELL ["/bin/bash", "-l", "-c"]
0061
0062 # Set up non-interactive shells by sourcing all of the scripts in /etc/profile.d/
0063 RUN cat <<"EOF" > /etc/bash.nonint
0064 if [ -d /etc/profile.d ]; then
0065 for i in /etc/profile.d/*.sh; do
0066 if [ -r $i ]; then
0067 . $i
0068 fi
0069 done
0070 unset i
0071 fi
0072 EOF
0073
0074 RUN cat /etc/bash.nonint >> /etc/bash.bashrc
0075
0076 ENV BASH_ENV=/etc/bash.nonint
0077 ENV SIMPHONY_PREFIX=/opt/simphony
0078 ENV SIMPHONY_HOME=/workspaces/simphony
0079 ENV SIMPHONY_BUILD=/opt/simphony/build
0080 ENV LD_LIBRARY_PATH=${SIMPHONY_PREFIX}/lib:${LD_LIBRARY_PATH}
0081 ENV VIRTUAL_ENV=${SIMPHONY_HOME}/.venv
0082 ENV PATH=${SIMPHONY_PREFIX}/bin:${VIRTUAL_ENV}/bin:${PATH}
0083 ENV NVIDIA_DRIVER_CAPABILITIES=graphics,compute,utility
0084
0085 WORKDIR $SIMPHONY_HOME
0086
0087 # Install Python dependencies
0088 COPY pyproject.toml uv.lock $SIMPHONY_HOME/
0089 COPY optiphy $SIMPHONY_HOME/optiphy
0090 RUN uv sync --python "${PYTHON_VERSION}" --managed-python
0091
0092
0093 FROM base AS release
0094
0095 ARG CMAKE_BUILD_JOBS
0096
0097 COPY . $SIMPHONY_HOME
0098
0099 RUN cmake -S $SIMPHONY_HOME -B $SIMPHONY_BUILD -DCMAKE_INSTALL_PREFIX=$SIMPHONY_PREFIX -DCMAKE_BUILD_TYPE=Release \
0100 && cmake --build $SIMPHONY_BUILD --parallel "${CMAKE_BUILD_JOBS:-$(nproc)}" --target install
0101
0102
0103 FROM base AS develop
0104
0105 ARG CMAKE_BUILD_JOBS
0106
0107 RUN apt update && apt install -y x11-apps mesa-utils vim
0108
0109 COPY . $SIMPHONY_HOME
0110
0111 RUN cmake -S $SIMPHONY_HOME -B $SIMPHONY_BUILD -DCMAKE_INSTALL_PREFIX=$SIMPHONY_PREFIX -DCMAKE_BUILD_TYPE=Debug \
0112 && cmake --build $SIMPHONY_BUILD --parallel "${CMAKE_BUILD_JOBS:-$(nproc)}" --target install
0113
0114
0115 FROM nvidia/cuda:${CUDA_VERSION}-devel-${OS} AS spack-base
0116
0117 ARG OPTIX_VERSION
0118 ARG GEANT4_VERSION
0119 ARG SPACK_BUILDCACHE_MIRROR
0120 ARG SPACK_TARGET
0121 ARG SPACK_VERSION=1.1.1
0122
0123 ENV DEBIAN_FRONTEND=noninteractive
0124
0125 # Install Spack package manager
0126 RUN apt update \
0127 && apt install -y build-essential ca-certificates coreutils curl gfortran git gpg lsb-release unzip zip python3 \
0128 && apt clean \
0129 && rm -rf /var/lib/apt/lists/*
0130
0131 RUN mkdir -p /opt/spack && curl -fsSL https://github.com/spack/spack/archive/v${SPACK_VERSION}.tar.gz | tar -xz --strip-components 1 -C /opt/spack
0132 RUN echo "source /opt/spack/share/spack/setup-env.sh" > /etc/profile.d/z09_source_spack_setup.sh
0133 RUN echo "source /etc/profile.d/z09_source_spack_setup.sh" >> /etc/bash.bashrc
0134
0135 ENV BASH_ENV=/etc/profile.d/z09_source_spack_setup.sh
0136 ENV SIMPHONY_PREFIX=/opt/simphony
0137 ENV SIMPHONY_HOME=/workspaces/simphony
0138 ENV SIMPHONY_BUILD=/opt/simphony/build
0139 ENV OPTIX_VERSION=${OPTIX_VERSION}
0140 ENV GEANT4_VERSION=${GEANT4_VERSION}
0141 ENV SPACK_BUILDCACHE_MIRROR=${SPACK_BUILDCACHE_MIRROR}
0142 ENV SPACK_TARGET=${SPACK_TARGET}
0143 ENV PATH=/opt/spack/bin:${PATH}
0144 ENV NVIDIA_DRIVER_CAPABILITIES=graphics,compute,utility
0145
0146 WORKDIR ${SIMPHONY_HOME}
0147
0148 SHELL ["/bin/bash", "-l", "-c"]
0149
0150 RUN mkdir -p /root/.spack \
0151 && cat > /root/.spack/packages.yaml <<EOF
0152 packages:
0153 all:
0154 target: [${SPACK_TARGET}]
0155 EOF
0156
0157
0158 FROM spack-base AS spack-no-env
0159
0160 WORKDIR ${SIMPHONY_HOME}
0161
0162 # Intentionally track the latest Spack repo state in CI to catch packaging regressions.
0163 RUN spack repo update -b develop builtin
0164 RUN spack repo add https://github.com/BNLNPPS/spack-packages
0165 RUN spack mirror add --unsigned simphony-buildcache "${SPACK_BUILDCACHE_MIRROR}"
0166 RUN spack external find --not-buildable --path /usr/local/cuda cuda
0167 # Print out concretized specs
0168 RUN spack spec --fresh -Il simphony ^geant4@${GEANT4_VERSION} ^optix-dev@${OPTIX_VERSION}
0169 # Prefer dependency binaries when they exist, but let PR validation fall back to
0170 # source builds if the mirror lags behind the latest Spack package metadata.
0171 RUN spack install --only=dependencies --fresh --use-buildcache auto simphony ^geant4@${GEANT4_VERSION} ^optix-dev@${OPTIX_VERSION}
0172 RUN spack install --fresh --use-buildcache package:never,dependencies:auto simphony ^geant4@${GEANT4_VERSION} ^optix-dev@${OPTIX_VERSION}
0173 RUN spack clean -a && rm -rf /root/.cache
0174 # Once simphony is installed it can be loaded in the user environment
0175 # $ spack load simphony
0176 # $ spack load --sh simphony >> /etc/profile.d/z10_load_simphony_from_spack.sh
0177 RUN set -euo pipefail \
0178 && spack find --format "{name}{@version} {/hash}" simphony \
0179 && prefix="$(spack location -i simphony)" \
0180 && echo "Installed prefix: $prefix" \
0181 && test -d "$prefix" \
0182 && (test -f "$prefix/.spack/spec.json" || test -f "$prefix/.spack/spec.yaml")
0183
0184 FROM develop AS default