-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathDockerfile
More file actions
196 lines (146 loc) · 6.87 KB
/
Copy pathDockerfile
File metadata and controls
196 lines (146 loc) · 6.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# syntax=docker/dockerfile:latest
ARG OS=ubuntu24.04
ARG CUDA_VERSION=13.0.3
ARG OPTIX_VERSION=9.0.0
ARG GEANT4_VERSION=11.4.2
ARG CMAKE_VERSION=4.2.1
ARG PYTHON_VERSION=3.13
ARG SPACK_BUILDCACHE_MIRROR=oci://ghcr.io/bnlnpps/simphony-spack-buildcache
ARG SPACK_TARGET=x86_64_v2
FROM nvidia/cuda:${CUDA_VERSION}-devel-${OS} AS base
ARG OPTIX_VERSION
ARG GEANT4_VERSION
ARG CMAKE_VERSION
ARG PYTHON_VERSION
ARG CMAKE_BUILD_JOBS
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update \
&& apt install -y g++ gcc gzip tar python3 python-is-python3 python3-pip curl git \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*
RUN apt update \
&& apt install -y nlohmann-json3-dev \
libglu1-mesa-dev libxmu-dev libglm-dev \
libxkbcommon-dev \
qt6-base-dev libxerces-c-dev libexpat1-dev \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*
RUN curl -fsSL https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-x86_64.tar.gz \
| tar -xz --strip-components=1 -C /usr/local
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 \
&& cmake -S /opt/clhep/src -B /opt/clhep/build \
&& cmake --build /opt/clhep/build --parallel "${CMAKE_BUILD_JOBS:-$(nproc)}" --target install \
&& rm -fr /opt/clhep
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 \
&& 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 \
&& cmake --build /opt/geant4/build --parallel "${CMAKE_BUILD_JOBS:-$(nproc)}" --target install \
&& rm -fr /opt/geant4
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 \
&& cmake -S /opt/plog/src -B /opt/plog/build \
&& cmake --build /opt/plog/build --parallel "${CMAKE_BUILD_JOBS:-$(nproc)}" --target install \
&& rm -fr /opt/plog
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
RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh
ENV UV_PYTHON=${PYTHON_VERSION}
ENV UV_MANAGED_PYTHON=1
SHELL ["/bin/bash", "-l", "-c"]
# Set up non-interactive shells by sourcing all of the scripts in /etc/profile.d/
RUN cat <<"EOF" > /etc/bash.nonint
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
EOF
RUN cat /etc/bash.nonint >> /etc/bash.bashrc
ENV BASH_ENV=/etc/bash.nonint
ENV SIMPHONY_PREFIX=/opt/simphony
ENV SIMPHONY_HOME=/workspaces/simphony
ENV SIMPHONY_BUILD=/opt/simphony/build
ENV LD_LIBRARY_PATH=${SIMPHONY_PREFIX}/lib:${LD_LIBRARY_PATH}
ENV VIRTUAL_ENV=${SIMPHONY_HOME}/.venv
ENV PATH=${SIMPHONY_PREFIX}/bin:${VIRTUAL_ENV}/bin:${PATH}
ENV NVIDIA_DRIVER_CAPABILITIES=graphics,compute,utility
WORKDIR $SIMPHONY_HOME
# Install Python dependencies
COPY pyproject.toml uv.lock $SIMPHONY_HOME/
COPY optiphy $SIMPHONY_HOME/optiphy
RUN uv sync --python "${PYTHON_VERSION}" --managed-python
FROM base AS devenv
ARG DEV_USER=dev
RUN if ! id -u "${DEV_USER}" >/dev/null 2>&1; then \
useradd --create-home --user-group --shell /bin/bash "${DEV_USER}"; \
fi
ENV HOME=/home/${DEV_USER}
USER ${DEV_USER}
FROM base AS release
ARG CMAKE_BUILD_JOBS
COPY . $SIMPHONY_HOME
RUN cmake -S $SIMPHONY_HOME -B $SIMPHONY_BUILD -DCMAKE_INSTALL_PREFIX=$SIMPHONY_PREFIX -DCMAKE_BUILD_TYPE=Release \
&& cmake --build $SIMPHONY_BUILD --parallel "${CMAKE_BUILD_JOBS:-$(nproc)}" --target install
FROM base AS develop
ARG CMAKE_BUILD_JOBS
RUN apt update && apt install -y x11-apps mesa-utils vim
COPY . $SIMPHONY_HOME
RUN cmake -S $SIMPHONY_HOME -B $SIMPHONY_BUILD -DCMAKE_INSTALL_PREFIX=$SIMPHONY_PREFIX -DCMAKE_BUILD_TYPE=Debug \
&& cmake --build $SIMPHONY_BUILD --parallel "${CMAKE_BUILD_JOBS:-$(nproc)}" --target install
FROM nvidia/cuda:${CUDA_VERSION}-devel-${OS} AS spack-base
ARG OPTIX_VERSION
ARG GEANT4_VERSION
ARG SPACK_BUILDCACHE_MIRROR
ARG SPACK_TARGET
ARG SPACK_VERSION=1.1.1
ENV DEBIAN_FRONTEND=noninteractive
# Install Spack package manager
RUN apt update \
&& apt install -y build-essential ca-certificates coreutils curl gfortran git gpg lsb-release unzip zip python3 \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*
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
RUN echo "source /opt/spack/share/spack/setup-env.sh" > /etc/profile.d/z09_source_spack_setup.sh
RUN echo "source /etc/profile.d/z09_source_spack_setup.sh" >> /etc/bash.bashrc
ENV BASH_ENV=/etc/profile.d/z09_source_spack_setup.sh
ENV SIMPHONY_PREFIX=/opt/simphony
ENV SIMPHONY_HOME=/workspaces/simphony
ENV SIMPHONY_BUILD=/opt/simphony/build
ENV OPTIX_VERSION=${OPTIX_VERSION}
ENV GEANT4_VERSION=${GEANT4_VERSION}
ENV SPACK_BUILDCACHE_MIRROR=${SPACK_BUILDCACHE_MIRROR}
ENV SPACK_TARGET=${SPACK_TARGET}
ENV PATH=/opt/spack/bin:${PATH}
ENV NVIDIA_DRIVER_CAPABILITIES=graphics,compute,utility
WORKDIR ${SIMPHONY_HOME}
SHELL ["/bin/bash", "-l", "-c"]
RUN mkdir -p /root/.spack \
&& cat > /root/.spack/packages.yaml <<EOF
packages:
all:
target: [${SPACK_TARGET}]
EOF
FROM spack-base AS spack-no-env
WORKDIR ${SIMPHONY_HOME}
# Intentionally track the latest Spack repo state in CI to catch packaging regressions.
RUN spack repo update -b develop builtin
RUN spack repo add https://github.com/BNLNPPS/spack-packages
RUN spack mirror add --unsigned simphony-buildcache "${SPACK_BUILDCACHE_MIRROR}"
RUN spack external find --not-buildable --path /usr/local/cuda cuda
# Print out concretized specs
RUN spack spec --fresh -Il simphony ^geant4@${GEANT4_VERSION} ^optix-dev@${OPTIX_VERSION}
# Prefer dependency binaries when they exist, but let PR validation fall back to
# source builds if the mirror lags behind the latest Spack package metadata.
RUN spack install --only=dependencies --fresh --use-buildcache auto simphony ^geant4@${GEANT4_VERSION} ^optix-dev@${OPTIX_VERSION}
RUN spack install --fresh --use-buildcache package:never,dependencies:auto simphony ^geant4@${GEANT4_VERSION} ^optix-dev@${OPTIX_VERSION}
RUN spack clean -a && rm -rf /root/.cache
# Once simphony is installed it can be loaded in the user environment
# $ spack load simphony
# $ spack load --sh simphony >> /etc/profile.d/z10_load_simphony_from_spack.sh
RUN set -euo pipefail \
&& spack find --format "{name}{@version} {/hash}" simphony \
&& prefix="$(spack location -i simphony)" \
&& echo "Installed prefix: $prefix" \
&& test -d "$prefix" \
&& (test -f "$prefix/.spack/spec.json" || test -f "$prefix/.spack/spec.yaml")
FROM develop AS default