1+ # EverythingDockerfile - Multistage build combining all services
2+ # This combines mongodb, api, handler, ui, and telemetry into a single container
3+
4+ # Stage 1: MongoDB base
5+ FROM mongo:4.4.15 AS mongodb-stage
6+ RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
7+
8+ # Stage 2: Neuroimaging tools and handler dependencies
9+ FROM neurodebian:nd20.04-non-free AS neuroimaging-stage
10+ SHELL ["/bin/bash", "-c"]
11+ ENV DEBIAN_FRONTEND noninteractive
12+
13+ RUN apt update && \
14+ apt-get update && apt-get upgrade -y
15+
16+ RUN apt update && apt install -y parallel python3 python3-pip tree curl unzip git jq python libgl-dev python-numpy bc
17+
18+ RUN pip3 install numpy==1.23.0 nibabel==4.0.0 pandas matplotlib pyyaml==5.4.1 pydicom==2.3.1 natsort pydeface && \
19+ pip3 install quickshear mne mne-bids pypet2bids==1.4.1
20+
21+ RUN apt-get install -y build-essential pkg-config cmake git pigz rename zstd libopenjp2-7 libgdcm-tools wget libopenblas-dev && \
22+ apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y
23+
24+ RUN touch /.pet2bidsconfig && chown 1001:1001 /.pet2bidsconfig
25+ RUN echo "DEFAULT_METADATA_JSON=/usr/local/lib/python3.8/dist-packages/pypet2bids/template_json.json" > /.pet2bidsconfig
26+
27+ RUN mkdir -p /usr/local/fsl && \
28+ git clone https://github.com/dlevitas/FSL_binaries /usr/local/fsl && \
29+ rm -rf /usr/local/fsl/README.md && \
30+ mkdir -p /usr/local/fsl/data/standard && \
31+ mv /usr/local/fsl/bin/MNI152_T1_2mm_brain.nii.gz /usr/local/fsl/data/standard
32+
33+ ENV FSLDIR=/usr/local/fsl
34+ ENV PATH=$PATH:$FSLDIR/bin
35+ ENV FSLOUTPUTTYPE=NIFTI_GZ
36+
37+ RUN apt-get update \
38+ && apt-get install -y ca-certificates curl gnupg \
39+ && mkdir -p /etc/apt/keyrings \
40+ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
41+
42+ ARG NODE_MAJOR=20
43+ RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
44+
45+ RUN apt-get update \
46+ && apt-get install nodejs -y
47+
48+ RUN cd /tmp && curl -fLO https://github.com/rordenlab/dcm2niix/releases/latest/download/dcm2niix_lnx.zip \
49+ && unzip /tmp/dcm2niix_lnx.zip \
50+ && mv dcm2niix /usr/local/bin
51+
52+ RUN mkdir -p /app
53+
54+ # Get bids-specification from github
55+ RUN cd /app && git clone https://github.com/bids-standard/bids-specification && \
56+ cd bids-specification && git checkout 3537e9edbc81545614d3ee605c398361099b6977
57+
58+ #install ROBEX
59+ ADD https://www.nitrc.org/frs/download.php/5994/ROBEXv12.linux64.tar.gz//?i_agree=1&download_now=1 /
60+ RUN tar -xzf /ROBEXv12.linux64.tar.gz
61+ ENV PATH /ROBEX:$PATH
62+
63+ ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
64+ ENV PATH $NVM_DIR/v$NODE_VERSION/bin:$PATH
65+
66+ #install bids-validator
67+ RUN npm install -g
[email protected] 68+ RUN npm install -g
[email protected] 69+ RUN git clone https://github.com/bids-standard/bids-validator
70+
71+ # Stage 3: Node.js base for API and UI
72+ FROM node:20 AS nodejs-stage
73+ RUN npm install -g
[email protected] pm2 typescript tsc-watch
74+
75+ # Stage 4: Telemetry dependencies
76+ FROM neurodebian:nd20.04-non-free AS telemetry-stage
77+ SHELL ["/bin/bash", "-c"]
78+ ENV DEBIAN_FRONTEND noninteractive
79+
80+ RUN apt update && \
81+ apt-get update && apt-get upgrade -y
82+
83+ RUN apt install -y parallel python3 python3-pip tree curl unzip git jq python libgl-dev python-numpy
84+ RUN pip3 install --upgrade pip
85+ RUN pip3 install conversiontelemetry
86+
87+ # Stage 5: Final combined stage
88+ FROM neurodebian:nd20.04-non-free AS everything
89+ SHELL ["/bin/bash", "-c"]
90+ ENV DEBIAN_FRONTEND noninteractive
91+
92+ # Install system dependencies
93+ RUN apt update && \
94+ apt-get update && apt-get upgrade -y && \
95+ apt install -y parallel python3 python3-pip tree curl unzip git jq python libgl-dev python-numpy bc \
96+ build-essential pkg-config cmake git pigz rename zstd libopenjp2-7 libgdcm-tools wget libopenblas-dev \
97+ ca-certificates gnupg supervisor && \
98+ apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y
99+
100+ # Install Node.js 20
101+ RUN mkdir -p /etc/apt/keyrings \
102+ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
103+
104+ ARG NODE_MAJOR=20
105+ RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
106+
107+ RUN apt-get update && apt-get install nodejs -y
108+
109+ # Install Python packages
110+ RUN pip3 install numpy==1.23.0 nibabel==4.0.0 pandas matplotlib pyyaml==5.4.1 pydicom==2.3.1 natsort pydeface && \
111+ pip3 install quickshear mne mne-bids pypet2bids==1.4.1 conversiontelemetry
112+
113+ # Install MongoDB
114+ RUN wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add - && \
115+ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list && \
116+ apt-get update && \
117+ apt-get install -y mongodb-org=4.4.15 mongodb-org-server=4.4.15 mongodb-org-shell=4.4.15 mongodb-org-mongos=4.4.15 mongodb-org-tools=4.4.15
118+
119+ # Install neuroimaging tools
120+ RUN touch /.pet2bidsconfig && chown 1001:1001 /.pet2bidsconfig
121+ RUN echo "DEFAULT_METADATA_JSON=/usr/local/lib/python3.8/dist-packages/pypet2bids/template_json.json" > /.pet2bidsconfig
122+
123+ RUN mkdir -p /usr/local/fsl && \
124+ git clone https://github.com/dlevitas/FSL_binaries /usr/local/fsl && \
125+ rm -rf /usr/local/fsl/README.md && \
126+ mkdir -p /usr/local/fsl/data/standard && \
127+ mv /usr/local/fsl/bin/MNI152_T1_2mm_brain.nii.gz /usr/local/fsl/data/standard
128+
129+ ENV FSLDIR=/usr/local/fsl
130+ ENV PATH=$PATH:$FSLDIR/bin
131+ ENV FSLOUTPUTTYPE=NIFTI_GZ
132+
133+ # Install dcm2niix
134+ RUN cd /tmp && curl -fLO https://github.com/rordenlab/dcm2niix/releases/latest/download/dcm2niix_lnx.zip \
135+ && unzip /tmp/dcm2niix_lnx.zip \
136+ && mv dcm2niix /usr/local/bin
137+
138+ # Install ROBEX
139+ ADD https://www.nitrc.org/frs/download.php/5994/ROBEXv12.linux64.tar.gz//?i_agree=1&download_now=1 /
140+ RUN tar -xzf /ROBEXv12.linux64.tar.gz
141+ ENV PATH /ROBEX:$PATH
142+
143+ # Install Node.js global packages
144+ RUN npm install -g
[email protected] pm2 typescript tsc-watch
[email protected] 145+
146+ # Get bids-specification from github
147+ RUN mkdir -p /app && \
148+ cd /app && git clone https://github.com/bids-standard/bids-specification && \
149+ cd bids-specification && git checkout 3537e9edbc81545614d3ee605c398361099b6977
150+
151+ # Clone bids-validator
152+ RUN git clone https://github.com/bids-standard/bids-validator /app/bids-validator
153+
154+ # Copy application code
155+ COPY . /app
156+
157+ # Generate keys for API
158+ WORKDIR /app
159+ RUN ./generate_keys.sh
160+
161+ # Install API dependencies and build
162+ WORKDIR /app/api
163+ RUN cp /app/package.json /app/api/ && npm install && npx tsc
164+
165+ # Install handler dependencies and build
166+ WORKDIR /app/handler
167+ RUN npm install && npx tsc
168+
169+ # Install UI dependencies
170+ WORKDIR /app/ui
171+ RUN npm install
172+
173+ # Copy UI entrypoint
174+ COPY ui/entrypoint.sh /entrypoint-ui.sh
175+ RUN chmod +x /entrypoint-ui.sh
176+
177+ # Copy telemetry environment
178+ COPY telemetry/telemetry.env /root/.telemetry.env
179+
180+ # Create supervisor configuration
181+ RUN mkdir -p /etc/supervisor/conf.d
182+ COPY <<EOF /etc/supervisor/conf.d/ezbids.conf
183+ [supervisord]
184+ nodaemon=true
185+ user=root
186+
187+ [program:mongodb]
188+ command=mongod --bind_ip_all --port 27017
189+ autostart=true
190+ autorestart=true
191+ stderr_logfile=/var/log/mongodb.err.log
192+ stdout_logfile=/var/log/mongodb.out.log
193+
194+ [program:api]
195+ command=/app/api/dev.sh
196+ directory=/app/api
197+ autostart=true
198+ autorestart=true
199+ environment=MONGO_CONNECTION_STRING="mongodb://localhost:27017/ezbids",BRAINLIFE_AUTHENTICATION="false"
200+ stderr_logfile=/var/log/api.err.log
201+ stdout_logfile=/var/log/api.out.log
202+ depends_on=mongodb
203+
204+ [program:handler]
205+ command=pm2 start handler.js --attach --watch --ignore-watch "ui **/node_modules **__pycache__**"
206+ directory=/app/handler
207+ autostart=true
208+ autorestart=true
209+ environment=MONGO_CONNECTION_STRING="mongodb://localhost:27017/ezbids",PRESORT="false"
210+ stderr_logfile=/var/log/handler.err.log
211+ stdout_logfile=/var/log/handler.out.log
212+ depends_on=api
213+
214+ [program:ui]
215+ command=/entrypoint-ui.sh
216+ directory=/app/ui
217+ autostart=true
218+ autorestart=true
219+ environment=VITE_APIHOST="http://localhost:8082",VITE_BRAINLIFE_AUTHENTICATION="false"
220+ stderr_logfile=/var/log/ui.err.log
221+ stdout_logfile=/var/log/ui.out.log
222+ depends_on=api
223+
224+ [program:telemetry]
225+ command=start-telemetry
226+ autostart=false
227+ autorestart=true
228+ stderr_logfile=/var/log/telemetry.err.log
229+ stdout_logfile=/var/log/telemetry.out.log
230+ depends_on=mongodb
231+ EOF
232+
233+ # Create necessary directories
234+ RUN mkdir -p /data/db /var/log /tmp/ezbids-workdir
235+
236+ # Expose ports
237+ EXPOSE 27017 8082 3000 8000
238+
239+ # Health check
240+ HEALTHCHECK --interval=10s --timeout=10s --retries=5 --start-period=30s \
241+ CMD curl -f http://localhost:8082/health || exit 1
242+
243+ # Start all services with supervisor
244+ CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/ezbids.conf"]
245+
246+
247+ # run with docker run -p 27017:27017 -p 8082:8082 -p 3000:3000 -p 8000:8000 -v /tmp/ezbids-workdir:/tmp ezbids-everything
0 commit comments