1
1
# Ubuntu 22.04 LTS - Jammy
2
- ARG BASE_IMAGE=ubuntu:jammy-20240125
2
+ ARG BASE_IMAGE=ubuntu:jammy-20250730
3
3
4
4
#
5
5
# Build wheel
6
6
#
7
- FROM python:slim AS src
8
- RUN pip install build
9
- RUN apt-get update && \
10
- apt-get install -y --no-install-recommends git
7
+ FROM ghcr.io/astral-sh/uv:python3.13-alpine AS src
8
+ RUN apk add git
11
9
COPY . /src
12
- RUN python -m build /src
10
+ RUN uv build --wheel /src
13
11
14
12
#
15
13
# Download stages
16
14
#
17
15
18
16
# Utilities for downloading packages
19
- FROM ${BASE_IMAGE} as downloader
17
+ FROM ${BASE_IMAGE} AS downloader
20
18
# Bump the date to current to refresh curl/certificates/etc
21
- RUN echo "2023.07.20 "
19
+ RUN echo "2025.09.25 "
22
20
RUN apt-get update && \
23
21
apt-get install -y --no-install-recommends \
24
22
binutils \
@@ -30,159 +28,79 @@ RUN apt-get update && \
30
28
31
29
RUN update-ca-certificates -f
32
30
33
- # FreeSurfer 7.3.2
34
- FROM downloader as freesurfer
35
- COPY docker/files/freesurfer7.3.2-exclude.txt /usr/local/etc/freesurfer7.3.2-exclude.txt
36
- COPY docker/files/fs-cert.pem /usr/local/etc/fs-cert.pem
37
- RUN curl --cacert /usr/local/etc/fs-cert.pem \
38
- -sSL https://surfer.nmr.mgh.harvard.edu/pub/dist/freesurfer/7.3.2/freesurfer-linux-ubuntu22_amd64-7.3.2.tar.gz \
39
- | tar zxv --no-same-owner -C /opt --exclude-from=/usr/local/etc/freesurfer7.3.2-exclude.txt
40
-
41
- # AFNI
42
- FROM downloader as afni
43
- # Bump the date to current to update AFNI
44
- RUN echo "2023.07.20"
45
- RUN mkdir -p /opt/afni-latest \
46
- && curl -fsSL --retry 5 https://afni.nimh.nih.gov/pub/dist/tgz/linux_openmp_64.tgz \
47
- | tar -xz -C /opt/afni-latest --strip-components 1 \
48
- --exclude "linux_openmp_64/*.gz" \
49
- --exclude "linux_openmp_64/funstuff" \
50
- --exclude "linux_openmp_64/shiny" \
51
- --exclude "linux_openmp_64/afnipy" \
52
- --exclude "linux_openmp_64/lib/RetroTS" \
53
- --exclude "linux_openmp_64/lib_RetroTS" \
54
- --exclude "linux_openmp_64/meica.libs" \
55
- # Keep only what we use
56
- && find /opt/afni-latest -type f -not \( \
57
- -name "3dTshift" -or \
58
- -name "3dUnifize" -or \
59
- -name "3dAutomask" -or \
60
- -name "3dvolreg" -or \
61
- -name "3dNwarpApply" \
62
- \) -delete
63
-
64
31
# Micromamba
65
- FROM downloader as micromamba
66
-
67
- # Install a C compiler to build extensions when needed.
68
- # traits<6.4 wheels are not available for Python 3.11+, but build easily.
69
- RUN apt-get update && \
70
- apt-get install -y --no-install-recommends build-essential && \
71
- apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
32
+ FROM downloader AS micromamba
72
33
73
34
WORKDIR /
74
35
# Bump the date to current to force update micromamba
75
- RUN echo "2024.02.06 "
36
+ RUN echo "2025.09.05 "
76
37
RUN curl -Ls https://micro.mamba.pm/api/micromamba/linux-64/latest | tar -xvj bin/micromamba
77
38
78
39
ENV MAMBA_ROOT_PREFIX="/opt/conda"
79
40
COPY env.yml /tmp/env.yml
80
- # COPY requirements.txt /tmp/requirements.txt
81
41
WORKDIR /tmp
82
42
RUN micromamba create -y -f /tmp/env.yml && \
83
43
micromamba clean -y -a
84
44
85
45
#
86
46
# Main stage
87
47
#
88
- FROM ${BASE_IMAGE} as nitransforms
48
+ FROM ${BASE_IMAGE} AS nitransforms
89
49
90
50
# Configure apt
91
51
ENV DEBIAN_FRONTEND="noninteractive" \
92
52
LANG="en_US.UTF-8" \
93
53
LC_ALL="en_US.UTF-8"
94
54
95
- # Some baseline tools; bc is needed for FreeSurfer, so don't drop it
96
55
RUN apt-get update && \
97
56
apt-get install -y --no-install-recommends \
98
- bc \
99
- ca-certificates \
100
- curl \
101
- git \
102
- gnupg \
103
- lsb-release \
104
- netbase \
105
- xvfb && \
57
+ libexpat1 \
58
+ libgomp1 \
59
+ && \
106
60
apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
107
61
108
- # Configure PPAs for libpng12 and libxp6
109
- RUN GNUPGHOME=/tmp gpg --keyserver hkps://keyserver.ubuntu.com --no-default-keyring --keyring /usr/share/keyrings/linuxuprising.gpg --recv 0xEA8CACC073C3DB2A \
110
- && GNUPGHOME=/tmp gpg --keyserver hkps://keyserver.ubuntu.com --no-default-keyring --keyring /usr/share/keyrings/zeehio.gpg --recv 0xA1301338A3A48C4A \
111
- && echo "deb [signed-by=/usr/share/keyrings/linuxuprising.gpg] https://ppa.launchpadcontent.net/linuxuprising/libpng12/ubuntu jammy main" > /etc/apt/sources.list.d/linuxuprising.list \
112
- && echo "deb [signed-by=/usr/share/keyrings/zeehio.gpg] https://ppa.launchpadcontent.net/zeehio/libxp/ubuntu jammy main" > /etc/apt/sources.list.d/zeehio.list
113
-
114
- # Dependencies for AFNI; requires a discontinued multiarch-support package from bionic (18.04)
115
- RUN apt-get update -qq \
116
- && apt-get install -y -q --no-install-recommends \
117
- ed \
118
- gsl-bin \
119
- libglib2.0-0 \
120
- libglu1-mesa-dev \
121
- libglw1-mesa \
122
- libgomp1 \
123
- libjpeg62 \
124
- libpng12-0 \
125
- libxm4 \
126
- libxp6 \
127
- netpbm \
128
- tcsh \
129
- xfonts-base \
130
- xvfb \
131
- && curl -sSL --retry 5 -o /tmp/multiarch.deb http://archive.ubuntu.com/ubuntu/pool/main/g/glibc/multiarch-support_2.27-3ubuntu1.5_amd64.deb \
132
- && dpkg -i /tmp/multiarch.deb \
133
- && rm /tmp/multiarch.deb \
134
- && apt-get install -f \
135
- && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
136
- && gsl2_path="$(find / -name 'libgsl.so.19' || printf '')" \
137
- && if [ -n "$gsl2_path" ]; then \
138
- ln -sfv "$gsl2_path" "$(dirname $gsl2_path)/libgsl.so.0" ; \
139
- fi \
140
- && ldconfig
141
-
142
- # Install files from stages
143
- COPY --from=freesurfer /opt/freesurfer /opt/freesurfer
144
- COPY --from=afni /opt/afni-latest /opt/afni-latest
62
+ # Install FreeSurfer and AFNI bins from images
63
+ COPY --from=freesurfer/freesurfer:7.4.1 \
64
+ /usr/local/freesurfer/bin/mri_vol2vol \
65
+ /usr/local/freesurfer/bin/
66
+ COPY --from=afni/afni_make_build:AFNI_25.2.09 \
67
+ /opt/afni/install/libf2c.so \
68
+ /opt/afni/install/libmri.so \
69
+ /usr/local/lib/
70
+ COPY --from=afni/afni_make_build:AFNI_25.2.09 \
71
+ /opt/afni/install/3dAllineate \
72
+ /opt/afni/install/3dNwarpApply \
73
+ /opt/afni/install/3dWarp \
74
+ /opt/afni/install/3drefit \
75
+ /opt/afni/install/3dvolreg \
76
+ /usr/local/bin/
145
77
146
78
# Simulate SetUpFreeSurfer.sh
147
79
ENV OS="Linux" \
148
80
FS_OVERRIDE=0 \
149
81
FIX_VERTEX_AREA="" \
150
82
FSF_OUTPUT_FORMAT="nii.gz" \
151
- FREESURFER_HOME="/opt /freesurfer"
83
+ FREESURFER_HOME="/usr/local /freesurfer"
152
84
ENV SUBJECTS_DIR="$FREESURFER_HOME/subjects" \
153
85
FUNCTIONALS_DIR="$FREESURFER_HOME/sessions" \
154
- MNI_DIR="$FREESURFER_HOME/mni" \
155
86
LOCAL_DIR="$FREESURFER_HOME/local" \
156
- MINC_BIN_DIR="$FREESURFER_HOME/mni/bin" \
157
- MINC_LIB_DIR="$FREESURFER_HOME/mni/lib" \
158
- MNI_DATAPATH="$FREESURFER_HOME/mni/data"
159
- ENV PERL5LIB="$MINC_LIB_DIR/perl5/5.8.5" \
160
- MNI_PERL5LIB="$MINC_LIB_DIR/perl5/5.8.5" \
161
- PATH="$FREESURFER_HOME/bin:$FREESURFER_HOME/tktools:$MINC_BIN_DIR:$PATH"
87
+ PATH="$FREESURFER_HOME/bin:$PATH"
162
88
163
89
# AFNI config
164
- ENV PATH="/opt/afni-latest:$PATH" \
165
- AFNI_IMSAVE_WARNINGS="NO" \
166
- AFNI_PLUGINPATH="/opt/afni-latest"
167
-
168
- # Workbench config
169
- ENV PATH="/opt/workbench/bin_linux64:$PATH"
90
+ ENV AFNI_IMSAVE_WARNINGS="NO"
170
91
171
92
# Create a shared $HOME directory
172
93
RUN useradd -m -s /bin/bash -G users neuro
173
94
WORKDIR /home/neuro
174
- ENV HOME="/home/neuro" \
175
- LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
95
+ ENV HOME="/home/neuro"
176
96
177
97
COPY --from=micromamba /bin/micromamba /bin/micromamba
178
98
COPY --from=micromamba /opt/conda/envs/nitransforms /opt/conda/envs/nitransforms
179
99
180
100
ENV MAMBA_ROOT_PREFIX="/opt/conda"
181
101
RUN micromamba shell init -s bash && \
182
102
echo "micromamba activate nitransforms" >> $HOME/.bashrc
183
- ENV PATH="/opt/conda/envs/nitransforms/bin:$PATH" \
184
- CPATH="/opt/conda/envs/nitransforms/include:$CPATH" \
185
- LD_LIBRARY_PATH="/opt/conda/envs/nitransforms/lib:$LD_LIBRARY_PATH"
103
+ ENV PATH="/opt/conda/envs/nitransforms/bin:$PATH"
186
104
187
105
# FSL environment
188
106
ENV LANG="C.UTF-8" \
@@ -196,22 +114,10 @@ ENV LANG="C.UTF-8" \
196
114
FSLREMOTECALL="" \
197
115
FSLGECUDAQ="cuda.q"
198
116
199
- # Unless otherwise specified each process should only use one thread - nipype
200
- # will handle parallelization
201
- ENV MKL_NUM_THREADS=1 \
202
- OMP_NUM_THREADS=1
203
-
204
117
# Install package
205
- # CRITICAL: Make sure python setup.py --version has been run at least once
206
- # outside the container, with access to the git history.
207
118
COPY --from=src /src/dist/*.whl .
208
119
RUN python -m pip install --no-cache-dir $( ls *.whl )[all]
209
120
210
-
211
- RUN find $HOME -type d -exec chmod go=u {} + && \
212
- find $HOME -type f -exec chmod go=u {} + && \
213
- rm -rf $HOME/.npm $HOME/.conda $HOME/.empty
214
-
215
121
RUN ldconfig
216
122
WORKDIR /tmp/
217
123
0 commit comments