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