Skip to content

Commit a9e85c8

Browse files
committed
enh(Docker): Add a Dockerfile and other support files
1 parent 2936f48 commit a9e85c8

File tree

3 files changed

+313
-0
lines changed

3 files changed

+313
-0
lines changed

.docker/neurodebian.gpg

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
-----BEGIN PGP PUBLIC KEY BLOCK-----
2+
Version: GnuPG v1
3+
4+
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
70+
=fAJZ
71+
-----END PGP PUBLIC KEY BLOCK-----

.dockerignore

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# python cache
2+
__pycache__/**/*
3+
__pycache__
4+
*.pyc
5+
6+
# python distribution
7+
build/**/*
8+
build
9+
dist/**/*
10+
dist
11+
fmriprep.egg-info/**/*
12+
fmriprep.egg-info
13+
.eggs/**/*
14+
.eggs
15+
16+
# housekeeping tools
17+
get_version.py
18+
update_changes.sh
19+
tox.ini
20+
21+
# pip installs
22+
src/**/*
23+
src/
24+
25+
# git
26+
.gitignore
27+
.git/**/*
28+
.git
29+
30+
# other
31+
work/**/*
32+
work
33+
out/**/*
34+
out/
35+
36+
# CI, etc.
37+
.circleci
38+
.circleci/**/*
39+
.zenodo.json
40+
.travis.yml
41+
.readthedocs.yml
42+
CONTRIBUTING.md

Dockerfile

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
# Use Ubuntu 16.04 LTS
2+
FROM ubuntu:xenial-20161213
3+
4+
# Pre-cache neurodebian key
5+
COPY .docker/neurodebian.gpg /usr/local/etc/neurodebian.gpg
6+
7+
# Prepare environment
8+
RUN apt-get update && \
9+
apt-get install -y --no-install-recommends \
10+
curl \
11+
bzip2 \
12+
ca-certificates \
13+
xvfb \
14+
cython3 \
15+
build-essential \
16+
autoconf \
17+
libtool \
18+
pkg-config \
19+
git && \
20+
curl -sL https://deb.nodesource.com/setup_10.x | bash - && \
21+
apt-get install -y --no-install-recommends \
22+
nodejs && \
23+
apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
24+
25+
# Install latest pandoc
26+
RUN curl -o pandoc-2.2.2.1-1-amd64.deb -sSL "https://github.com/jgm/pandoc/releases/download/2.2.2.1/pandoc-2.2.2.1-1-amd64.deb" && \
27+
dpkg -i pandoc-2.2.2.1-1-amd64.deb && \
28+
rm pandoc-2.2.2.1-1-amd64.deb
29+
30+
# Installing freesurfer
31+
RUN curl -sSL https://surfer.nmr.mgh.harvard.edu/pub/dist/freesurfer/6.0.1/freesurfer-Linux-centos6_x86_64-stable-pub-v6.0.1.tar.gz | tar zxv --no-same-owner -C /opt \
32+
--exclude='freesurfer/diffusion' \
33+
--exclude='freesurfer/docs' \
34+
--exclude='freesurfer/fsfast' \
35+
--exclude='freesurfer/lib/cuda' \
36+
--exclude='freesurfer/lib/qt' \
37+
--exclude='freesurfer/matlab' \
38+
--exclude='freesurfer/mni/share/man' \
39+
--exclude='freesurfer/subjects/fsaverage_sym' \
40+
--exclude='freesurfer/subjects/fsaverage3' \
41+
--exclude='freesurfer/subjects/fsaverage4' \
42+
--exclude='freesurfer/subjects/cvs_avg35' \
43+
--exclude='freesurfer/subjects/cvs_avg35_inMNI152' \
44+
--exclude='freesurfer/subjects/bert' \
45+
--exclude='freesurfer/subjects/lh.EC_average' \
46+
--exclude='freesurfer/subjects/rh.EC_average' \
47+
--exclude='freesurfer/subjects/sample-*.mgz' \
48+
--exclude='freesurfer/subjects/V1_average' \
49+
--exclude='freesurfer/trctrain'
50+
51+
ENV FSL_DIR="/usr/share/fsl/5.0" \
52+
OS="Linux" \
53+
FS_OVERRIDE=0 \
54+
FIX_VERTEX_AREA="" \
55+
FSF_OUTPUT_FORMAT="nii.gz" \
56+
FREESURFER_HOME="/opt/freesurfer"
57+
ENV SUBJECTS_DIR="$FREESURFER_HOME/subjects" \
58+
FUNCTIONALS_DIR="$FREESURFER_HOME/sessions" \
59+
MNI_DIR="$FREESURFER_HOME/mni" \
60+
LOCAL_DIR="$FREESURFER_HOME/local" \
61+
MINC_BIN_DIR="$FREESURFER_HOME/mni/bin" \
62+
MINC_LIB_DIR="$FREESURFER_HOME/mni/lib" \
63+
MNI_DATAPATH="$FREESURFER_HOME/mni/data"
64+
ENV PERL5LIB="$MINC_LIB_DIR/perl5/5.8.5" \
65+
MNI_PERL5LIB="$MINC_LIB_DIR/perl5/5.8.5" \
66+
PATH="$FREESURFER_HOME/bin:$FSFAST_HOME/bin:$FREESURFER_HOME/tktools:$MINC_BIN_DIR:$PATH"
67+
68+
# Installing Neurodebian packages (FSL, AFNI, git)
69+
RUN curl -sSL "http://neuro.debian.net/lists/$( lsb_release -c | cut -f2 ).us-ca.full" >> /etc/apt/sources.list.d/neurodebian.sources.list && \
70+
apt-key add /usr/local/etc/neurodebian.gpg && \
71+
(apt-key adv --refresh-keys --keyserver hkp://ha.pool.sks-keyservers.net 0xA5D32F012649A5A9 || true)
72+
73+
RUN apt-get update && \
74+
apt-get install -y --no-install-recommends \
75+
fsl-core=5.0.9-5~nd16.04+1 \
76+
fsl-mni152-templates=5.0.7-2 \
77+
afni=16.2.07~dfsg.1-5~nd16.04+1 \
78+
convert3d \
79+
git-annex-standalone && \
80+
apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
81+
82+
ENV FSLDIR="/usr/share/fsl/5.0" \
83+
FSLOUTPUTTYPE="NIFTI_GZ" \
84+
FSLMULTIFILEQUIT="TRUE" \
85+
POSSUMDIR="/usr/share/fsl/5.0" \
86+
LD_LIBRARY_PATH="/usr/lib/fsl/5.0:$LD_LIBRARY_PATH" \
87+
FSLTCLSH="/usr/bin/tclsh" \
88+
FSLWISH="/usr/bin/wish" \
89+
AFNI_MODELPATH="/usr/lib/afni/models" \
90+
AFNI_IMSAVE_WARNINGS="NO" \
91+
AFNI_TTATLAS_DATASET="/usr/share/afni/atlases" \
92+
AFNI_PLUGINPATH="/usr/lib/afni/plugins"
93+
ENV PATH="/usr/lib/fsl/5.0:/usr/lib/afni/bin:$PATH"
94+
95+
# Installing ANTs 2.2.0 (NeuroDocker build)
96+
ENV ANTSPATH=/usr/lib/ants
97+
RUN mkdir -p $ANTSPATH && \
98+
curl -sSL "https://dl.dropbox.com/s/2f4sui1z6lcgyek/ANTs-Linux-centos5_x86_64-v2.2.0-0740f91.tar.gz" \
99+
| tar -xzC $ANTSPATH --strip-components 1
100+
ENV PATH=$ANTSPATH:$PATH
101+
102+
# Create a shared $HOME directory
103+
RUN useradd -m -s /bin/bash -G users dmriprep
104+
WORKDIR /home/dmriprep
105+
ENV HOME="/home/dmriprep"
106+
107+
# Installing SVGO
108+
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
109+
RUN apt-get install -y nodejs
110+
RUN npm install -g svgo
111+
112+
# Installing bids-validator
113+
RUN npm install -g [email protected]
114+
115+
# Installing and setting up ICA_AROMA
116+
RUN mkdir -p /opt/ICA-AROMA && \
117+
curl -sSL "https://github.com/maartenmennes/ICA-AROMA/archive/v0.4.4-beta.tar.gz" \
118+
| tar -xzC /opt/ICA-AROMA --strip-components 1 && \
119+
chmod +x /opt/ICA-AROMA/ICA_AROMA.py
120+
121+
ENV PATH=/opt/ICA-AROMA:$PATH
122+
123+
# Installing and setting up miniconda
124+
RUN curl -sSLO https://repo.continuum.io/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh && \
125+
bash Miniconda3-4.5.11-Linux-x86_64.sh -b -p /usr/local/miniconda && \
126+
rm Miniconda3-4.5.11-Linux-x86_64.sh
127+
128+
# Set CPATH for packages relying on compiled libs (e.g. indexed_gzip)
129+
ENV PATH="/usr/local/miniconda/bin:$PATH" \
130+
CPATH="/usr/local/miniconda/include/:$CPATH" \
131+
LANG="C.UTF-8" \
132+
LC_ALL="C.UTF-8" \
133+
PYTHONNOUSERSITE=1
134+
135+
# Installing precomputed python packages
136+
RUN conda install -y python=3.7.1 \
137+
pip=19.1 \
138+
mkl=2018.0.3 \
139+
mkl-service \
140+
numpy=1.15.4 \
141+
scipy=1.1.0 \
142+
scikit-learn=0.19.1 \
143+
matplotlib=2.2.2 \
144+
pandas=0.23.4 \
145+
libxml2=2.9.8 \
146+
libxslt=1.1.32 \
147+
graphviz=2.40.1 \
148+
traits=4.6.0 \
149+
zlib; sync && \
150+
chmod -R a+rX /usr/local/miniconda; sync && \
151+
chmod +x /usr/local/miniconda/bin/*; sync && \
152+
conda build purge-all; sync && \
153+
conda clean -tipsy && sync
154+
155+
# Unless otherwise specified each process should only use one thread - nipype
156+
# will handle parallelization
157+
ENV MKL_NUM_THREADS=1 \
158+
OMP_NUM_THREADS=1
159+
160+
# Precaching fonts, set 'Agg' as default backend for matplotlib
161+
RUN python -c "from matplotlib import font_manager" && \
162+
sed -i 's/\(backend *: \).*$/\1Agg/g' $( python -c "import matplotlib; print(matplotlib.matplotlib_fname())" )
163+
164+
# Precaching atlases
165+
RUN pip install --no-cache-dir "templateflow>=0.4.0,<0.5.0a0" && \
166+
python -c "from templateflow import api as tfapi; \
167+
tfapi.get('MNI152NLin6Asym', atlas=None, extension=['.nii', '.nii.gz']); \
168+
tfapi.get('MNI152NLin2009cAsym', atlas=None, extension=['.nii', '.nii.gz']); \
169+
tfapi.get('OASIS30ANTs', extension=['.nii', '.nii.gz']);" && \
170+
find $HOME/.cache/templateflow -type d -exec chmod go=u {} + && \
171+
find $HOME/.cache/templateflow -type f -exec chmod go=u {} +
172+
173+
# Installing FMRIPREP
174+
COPY . /src/dmriprep
175+
ARG VERSION
176+
# Force static versioning within container
177+
RUN echo "${VERSION}" > /src/dmriprep/dmriprep/VERSION && \
178+
echo "include dmriprep/VERSION" >> /src/dmriprep/MANIFEST.in && \
179+
pip install --no-cache-dir "/src/dmriprep[all]"
180+
181+
RUN find $HOME -type d -exec chmod go=u {} + && \
182+
find $HOME -type f -exec chmod go=u {} +
183+
184+
ENV IS_DOCKER_8395080871=1
185+
186+
RUN ldconfig
187+
WORKDIR /tmp/
188+
ENTRYPOINT ["/usr/local/miniconda/bin/dmriprep"]
189+
190+
ARG BUILD_DATE
191+
ARG VCS_REF
192+
ARG VERSION
193+
LABEL org.label-schema.build-date=$BUILD_DATE \
194+
org.label-schema.name="dMRIPrep" \
195+
org.label-schema.description="dMRIPrep - robust dMRI preprocessing tool" \
196+
org.label-schema.url="http://dmriprep.org" \
197+
org.label-schema.vcs-ref=$VCS_REF \
198+
org.label-schema.vcs-url="https://github.com/nipreps/dmriprep" \
199+
org.label-schema.version=$VERSION \
200+
org.label-schema.schema-version="1.0"

0 commit comments

Comments
 (0)