Skip to content

Commit

Permalink
make lighter alpine multi-stage build docker image, ~60% smaller
Browse files Browse the repository at this point in the history
  • Loading branch information
bpinsard committed Oct 15, 2024
1 parent 7200a0b commit 0807931
Showing 1 changed file with 32 additions and 157 deletions.
189 changes: 32 additions & 157 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,159 +1,34 @@
# Generated by Neurodocker and Reproenv.
FROM python:3.10-alpine AS builder

FROM neurodebian:bullseye
ENV PATH="/opt/dcm2niix-v1.0.20220720/bin:$PATH"
RUN apt-get update -qq \
&& apt-get install -y -q --no-install-recommends \
ca-certificates \
cmake \
g++ \
gcc \
git \
make \
pigz \
zlib1g-dev \
&& rm -rf /var/lib/apt/lists/* \
&& git clone https://github.com/rordenlab/dcm2niix /tmp/dcm2niix \
&& cd /tmp/dcm2niix \
&& git fetch --tags \
&& git checkout v1.0.20220720 \
&& mkdir /tmp/dcm2niix/build \
&& cd /tmp/dcm2niix/build \
&& cmake -DZLIB_IMPLEMENTATION=Cloudflare -DUSE_JPEGLS=ON -DUSE_OPENJPEG=ON -DCMAKE_INSTALL_PREFIX:PATH=/opt/dcm2niix-v1.0.20220720 .. \
&& make -j1 \
&& make install \
&& rm -rf /tmp/dcm2niix
RUN apt-get update -qq \
&& apt-get install -y -q --no-install-recommends \
gcc \
git \
git-annex-standalone \
libc-dev \
liblzma-dev \
netbase \
pigz \
&& rm -rf /var/lib/apt/lists/*
COPY [".", \
"/src/heudiconv"]
ENV CONDA_DIR="/opt/miniconda-py39_4.12.0" \
PATH="/opt/miniconda-py39_4.12.0/bin:$PATH"
RUN apt-get update -qq \
&& apt-get install -y -q --no-install-recommends \
bzip2 \
ca-certificates \
curl \
&& rm -rf /var/lib/apt/lists/* \
# Install dependencies.
&& export PATH="/opt/miniconda-py39_4.12.0/bin:$PATH" \
&& echo "Downloading Miniconda installer ..." \
&& conda_installer="/tmp/miniconda.sh" \
&& curl -fsSL -o "$conda_installer" https://repo.continuum.io/miniconda/Miniconda3-py39_4.12.0-Linux-x86_64.sh \
&& bash "$conda_installer" -b -p /opt/miniconda-py39_4.12.0 \
&& rm -f "$conda_installer" \
# Prefer packages in conda-forge
&& conda config --system --prepend channels conda-forge \
# Packages in lower-priority channels not considered if a package with the same
# name exists in a higher priority channel. Can dramatically speed up installations.
# Conda recommends this as a default
# https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-channels.html
&& conda config --set channel_priority strict \
&& conda config --system --set auto_update_conda false \
&& conda config --system --set show_channel_urls true \
# Enable `conda activate`
&& conda init bash \
&& conda install -y --name base \
"python=3.9" \
"traits>=4.6.0" \
"scipy" \
"numpy" \
"nomkl" \
"pandas" \
"gdcm" \
&& bash -c "source activate base \
&& python -m pip install --no-cache-dir --editable \
"/src/heudiconv[all]"" \
# Clean up
&& sync && conda clean --all --yes && sync \
&& rm -rf ~/.cache/pip/*
ENTRYPOINT ["heudiconv"]
RUN apk add bash \
gcc \
g++ \
libc-dev \
make \
cmake \
util-linux-dev \
curl \
git
RUN pip install --no-cache-dir pylibjpeg-libjpeg traits==6.3.2

ARG DCM2NIIX_VERSION=v1.0.20240202
RUN git clone https://github.com/rordenlab/dcm2niix /tmp/dcm2niix \
&& cd /tmp/dcm2niix \
&& git fetch --tags \
&& git checkout $DCM2NIIX_VERSION \
&& mkdir /tmp/dcm2niix/build \
&& cd /tmp/dcm2niix/build \
&& cmake -DZLIB_IMPLEMENTATION=Cloudflare -DUSE_JPEGLS=ON -DUSE_OPENJPEG=ON -DCMAKE_INSTALL_PREFIX:PATH=/usr/ .. \
&& make -j1 \
&& make install \
&& rm -rf /tmp/dcm2niix

FROM python:3.10-alpine
COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
COPY --from=builder /usr/bin/dcm2niix /usr/bin/dcm2niix

# Save specification to JSON.
RUN printf '{ \
"pkg_manager": "apt", \
"existing_users": [ \
"root" \
], \
"instructions": [ \
{ \
"name": "from_", \
"kwds": { \
"base_image": "neurodebian:bullseye" \
} \
}, \
{ \
"name": "env", \
"kwds": { \
"PATH": "/opt/dcm2niix-v1.0.20220720/bin:$PATH" \
} \
}, \
{ \
"name": "run", \
"kwds": { \
"command": "apt-get update -qq\\napt-get install -y -q --no-install-recommends \\\\\\n ca-certificates \\\\\\n cmake \\\\\\n g++ \\\\\\n gcc \\\\\\n git \\\\\\n make \\\\\\n pigz \\\\\\n zlib1g-dev\\nrm -rf /var/lib/apt/lists/*\\ngit clone https://github.com/rordenlab/dcm2niix /tmp/dcm2niix\\ncd /tmp/dcm2niix\\ngit fetch --tags\\ngit checkout v1.0.20220720\\nmkdir /tmp/dcm2niix/build\\ncd /tmp/dcm2niix/build\\ncmake -DZLIB_IMPLEMENTATION=Cloudflare -DUSE_JPEGLS=ON -DUSE_OPENJPEG=ON -DCMAKE_INSTALL_PREFIX:PATH=/opt/dcm2niix-v1.0.20220720 ..\\nmake -j1\\nmake install\\nrm -rf /tmp/dcm2niix" \
} \
}, \
{ \
"name": "install", \
"kwds": { \
"pkgs": [ \
"git", \
"gcc", \
"pigz", \
"liblzma-dev", \
"libc-dev", \
"git-annex-standalone", \
"netbase" \
], \
"opts": null \
} \
}, \
{ \
"name": "run", \
"kwds": { \
"command": "apt-get update -qq \\\\\\n && apt-get install -y -q --no-install-recommends \\\\\\n gcc \\\\\\n git \\\\\\n git-annex-standalone \\\\\\n libc-dev \\\\\\n liblzma-dev \\\\\\n netbase \\\\\\n pigz \\\\\\n && rm -rf /var/lib/apt/lists/*" \
} \
}, \
{ \
"name": "copy", \
"kwds": { \
"source": [ \
".", \
"/src/heudiconv" \
], \
"destination": "/src/heudiconv" \
} \
}, \
{ \
"name": "env", \
"kwds": { \
"CONDA_DIR": "/opt/miniconda-py39_4.12.0", \
"PATH": "/opt/miniconda-py39_4.12.0/bin:$PATH" \
} \
}, \
{ \
"name": "run", \
"kwds": { \
"command": "apt-get update -qq\\napt-get install -y -q --no-install-recommends \\\\\\n bzip2 \\\\\\n ca-certificates \\\\\\n curl\\nrm -rf /var/lib/apt/lists/*\\n# Install dependencies.\\nexport PATH=\\"/opt/miniconda-py39_4.12.0/bin:$PATH\\"\\necho \\"Downloading Miniconda installer ...\\"\\nconda_installer=\\"/tmp/miniconda.sh\\"\\ncurl -fsSL -o \\"$conda_installer\\" https://repo.continuum.io/miniconda/Miniconda3-py39_4.12.0-Linux-x86_64.sh\\nbash \\"$conda_installer\\" -b -p /opt/miniconda-py39_4.12.0\\nrm -f \\"$conda_installer\\"\\n# Prefer packages in conda-forge\\nconda config --system --prepend channels conda-forge\\n# Packages in lower-priority channels not considered if a package with the same\\n# name exists in a higher priority channel. Can dramatically speed up installations.\\n# Conda recommends this as a default\\n# https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-channels.html\\nconda config --set channel_priority strict\\nconda config --system --set auto_update_conda false\\nconda config --system --set show_channel_urls true\\n# Enable `conda activate`\\nconda init bash\\nconda install -y --name base \\\\\\n \\"python=3.9\\" \\\\\\n \\"traits>=4.6.0\\" \\\\\\n \\"scipy\\" \\\\\\n \\"numpy\\" \\\\\\n \\"nomkl\\" \\\\\\n \\"pandas\\" \\\\\\n \\"gdcm\\"\\nbash -c \\"source activate base\\n python -m pip install --no-cache-dir --editable \\\\\\n \\"/src/heudiconv[all]\\"\\"\\n# Clean up\\nsync && conda clean --all --yes && sync\\nrm -rf ~/.cache/pip/*" \
} \
}, \
{ \
"name": "entrypoint", \
"kwds": { \
"args": [ \
"heudiconv" \
] \
} \
} \
] \
}' > /.reproenv.json
# End saving to specification to JSON.
RUN apk update && apk add --no-cache git git-annex pigz gcompat

RUN pip install --no-cache-dir heudiconv

ENTRYPOINT ["heudiconv"]

0 comments on commit 0807931

Please sign in to comment.