diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..4b1819d6 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,52 @@ +--- +version: 2.1 +jobs: + build: + machine: + # https://circleci.com/developer/machine/image/ubuntu-2204 + image: ubuntu-2204:2022.10.2 + steps: + - checkout + - run: + name: build docker image + command: | + cp ./circleci/build_docker.sh build_docker.sh + bash build_docker.sh + - persist_to_workspace: + root: /home/circleci + paths: + - docker/image.tar + + deploy: + machine: + image: ubuntu-2204:2022.10.2 + steps: + - attach_workspace: + at: /tmp/workspace + - checkout + - run: docker load -i /tmp/workspace/docker/image.tar + - run: + name: push to dockerhub + command: | + cp ./circleci/push_docker.sh push_docker.sh + bash push_docker.sh + +workflows: + build_deploy: + jobs: + - build: + filters: + branches: + only: /.*/ + tags: + only: /.*/ + - deploy: + context: + - dockerhub + requires: + - build + filters: + branches: + only: /.*/ + tags: + only: /.*/ diff --git a/Dockerfile b/Dockerfile old mode 100755 new mode 100644 index 13b22194..22606830 --- a/Dockerfile +++ b/Dockerfile @@ -1,319 +1,234 @@ -# Generated by: Neurodocker version 0.7.0+0.gdc97516.dirty -# Latest release: Neurodocker version 0.7.0 -# Timestamp: 2021/11/09 11:04:47 UTC -# -# Thank you for using Neurodocker. If you discover any issues -# or ways to improve this software, please submit an issue or -# pull request on our GitHub repository: -# -# https://github.com/ReproNim/neurodocker - -FROM neurodebian:stretch-non-free - -USER root - -ARG DEBIAN_FRONTEND="noninteractive" - -ENV LANG="en_US.UTF-8" \ - LC_ALL="en_US.UTF-8" \ - ND_ENTRYPOINT="/neurodocker/startup.sh" -RUN export ND_ENTRYPOINT="/neurodocker/startup.sh" \ - && apt-get update -qq \ - && apt-get install -y -q --no-install-recommends \ - apt-utils \ - bzip2 \ - ca-certificates \ +# Generated by Neurodocker and Reproenv. + +FROM centos:7 +RUN yum install -y -q \ + git \ + && yum clean all \ + && rm -rf /var/cache/yum/* +ENV ANTSPATH="/opt/ants-2.4.3/" \ + PATH="/opt/ants-2.4.3:$PATH" +RUN yum install -y -q \ curl \ - locales \ unzip \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* \ - && sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen \ - && dpkg-reconfigure --frontend=noninteractive locales \ - && update-locale LANG="en_US.UTF-8" \ - && chmod 777 /opt && chmod a+s /opt \ - && mkdir -p /neurodocker \ - && if [ ! -f "$ND_ENTRYPOINT" ]; then \ - echo '#!/usr/bin/env bash' >> "$ND_ENTRYPOINT" \ - && echo 'set -e' >> "$ND_ENTRYPOINT" \ - && echo 'export USER="${USER:=`whoami`}"' >> "$ND_ENTRYPOINT" \ - && echo 'if [ -n "$1" ]; then "$@"; else /usr/bin/env bash; fi' >> "$ND_ENTRYPOINT"; \ - fi \ - && chmod -R 777 /neurodocker && chmod a+s /neurodocker - -ENTRYPOINT ["/neurodocker/startup.sh"] - -RUN apt-get update -qq \ - && apt-get install -y -q --no-install-recommends \ - git \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -ENV FSLDIR="/opt/fsl-6.0.3" \ - PATH="/opt/fsl-6.0.3/bin:$PATH" \ + && yum clean all \ + && rm -rf /var/cache/yum/* \ + && echo "Downloading ANTs ..." \ + && curl -fsSL -o ants.zip https://github.com/ANTsX/ANTs/releases/download/v2.4.3/ants-2.4.3-centos7-X64-gcc.zip \ + && unzip ants.zip -d /opt \ + && mv /opt/ants-2.4.3/bin/* /opt/ants-2.4.3 \ + && rm ants.zip +ENV FSLDIR="/opt/fsl-6.0.6.4" \ + PATH="/opt/fsl-6.0.6.4/bin:$PATH" \ FSLOUTPUTTYPE="NIFTI_GZ" \ FSLMULTIFILEQUIT="TRUE" \ - FSLTCLSH="/opt/fsl-6.0.3/bin/fsltclsh" \ - FSLWISH="/opt/fsl-6.0.3/bin/fslwish" \ + FSLTCLSH="/opt/fsl-6.0.6.4/bin/fsltclsh" \ + FSLWISH="/opt/fsl-6.0.6.4/bin/fslwish" \ FSLLOCKDIR="" \ FSLMACHINELIST="" \ FSLREMOTECALL="" \ FSLGECUDAQ="cuda.q" -RUN apt-get update -qq \ - && apt-get install -y -q --no-install-recommends \ +RUN yum install -y -q \ bc \ - dc \ + curl \ file \ - libfontconfig1 \ - libfreetype6 \ - libgl1-mesa-dev \ - libgl1-mesa-dri \ - libglu1-mesa-dev \ - libgomp1 \ - libice6 \ - libxcursor1 \ - libxft2 \ - libxinerama1 \ - libxrandr2 \ - libxrender1 \ - libxt6 \ + libGL \ + libGLU \ + libICE \ + libSM \ + libX11 \ + libXcursor \ + libXext \ + libXft \ + libXinerama \ + libXrandr \ + libXt \ + libgomp \ + libjpeg \ + libmng \ + libpng12 \ + nano \ + openblas-serial \ + python3 \ sudo \ wget \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* \ - && echo "Downloading FSL ..." \ - && mkdir -p /opt/fsl-6.0.3 \ - && curl -fsSL --retry 5 https://fsl.fmrib.ox.ac.uk/fsldownloads/fsl-6.0.3-centos6_64.tar.gz \ - | tar -xz -C /opt/fsl-6.0.3 --strip-components 1 \ - && sed -i '$iecho Some packages in this Docker container are non-free' $ND_ENTRYPOINT \ - && sed -i '$iecho If you are considering commercial use of this container, please consult the relevant license:' $ND_ENTRYPOINT \ - && sed -i '$iecho https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/Licence' $ND_ENTRYPOINT \ - && sed -i '$isource $FSLDIR/etc/fslconf/fsl.sh' $ND_ENTRYPOINT \ - && echo "Installing FSL conda environment ..." \ - && bash /opt/fsl-6.0.3/etc/fslconf/fslpython_install.sh -f /opt/fsl-6.0.3 - -ENV PATH="/opt/afni-latest:$PATH" \ - AFNI_PLUGINPATH="/opt/afni-latest" -RUN apt-get update -qq \ - && apt-get install -y -q --no-install-recommends \ - ed \ - gsl-bin \ - libglib2.0-0 \ - libglu1-mesa-dev \ - libglw1-mesa \ - libgomp1 \ - libjpeg62 \ - libnlopt-dev \ - libxm4 \ - netpbm \ - python \ - python3 \ - r-base \ - r-base-dev \ - tcsh \ - xfonts-base \ - xvfb \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* \ - && curl -sSL --retry 5 -o /tmp/toinstall.deb http://mirrors.kernel.org/debian/pool/main/libx/libxp/libxp6_1.0.2-2_amd64.deb \ - && dpkg -i /tmp/toinstall.deb \ - && rm /tmp/toinstall.deb \ - && curl -sSL --retry 5 -o /tmp/toinstall.deb http://snapshot.debian.org/archive/debian-security/20160113T213056Z/pool/updates/main/libp/libpng/libpng12-0_1.2.49-1%2Bdeb7u2_amd64.deb \ - && dpkg -i /tmp/toinstall.deb \ - && rm /tmp/toinstall.deb \ - && apt-get install -f \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* \ - && gsl2_path="$(find / -name 'libgsl.so.19' || printf '')" \ - && if [ -n "$gsl2_path" ]; then \ - ln -sfv "$gsl2_path" "$(dirname $gsl2_path)/libgsl.so.0"; \ - fi \ - && ldconfig \ - && echo "Downloading AFNI ..." \ - && mkdir -p /opt/afni-latest \ - && curl -fsSL --retry 5 https://afni.nimh.nih.gov/pub/dist/tgz/linux_openmp_64.tgz \ - | tar -xz -C /opt/afni-latest --strip-components 1 \ - && PATH=$PATH:/opt/afni-latest rPkgsInstall -pkgs ALL - + && yum clean all \ + && rm -rf /var/cache/yum/* \ + && echo "Installing FSL ..." \ + && curl -fsSL https://fsl.fmrib.ox.ac.uk/fsldownloads/fslconda/releases/fslinstaller.py | python3 - -d /opt/fsl-6.0.6.4 -V 6.0.6.4 ENV FORCE_SPMMCR="1" \ SPM_HTML_BROWSER="0" \ - LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu:/opt/matlabmcr-2010a/v713/runtime/glnxa64:/opt/matlabmcr-2010a/v713/bin/glnxa64:/opt/matlabmcr-2010a/v713/sys/os/glnxa64:/opt/matlabmcr-2010a/v713/extern/bin/glnxa64" \ - MATLABCMD="/opt/matlabmcr-2010a/v713/toolbox/matlab" + SPMMCRCMD="/opt/spm12-r7771/run_spm12.sh /opt/matlab-compiler-runtime-2010a/v713 script" \ + LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu:/opt/matlab-compiler-runtime-2010a/v713/runtime/glnxa64:/opt/matlab-compiler-runtime-2010a/v713/bin/glnxa64:/opt/matlab-compiler-runtime-2010a/v713/sys/os/glnxa64:/opt/matlab-compiler-runtime-2010a/v713/extern/bin/glnxa64" \ + MATLABCMD="/opt/matlab-compiler-runtime-2010a/v713/toolbox/matlab" RUN export TMPDIR="$(mktemp -d)" \ - && apt-get update -qq \ - && apt-get install -y -q --no-install-recommends \ + && yum install -y -q \ bc \ - libncurses5 \ - libxext6 \ - libxmu6 \ - libxpm-dev \ - libxt6 \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* \ + curl \ + libXext \ + libXmu \ + libXpm \ + libXt \ + unzip \ + && yum clean all \ + && rm -rf /var/cache/yum/* \ && echo "Downloading MATLAB Compiler Runtime ..." \ - && curl -sSL --retry 5 -o /tmp/toinstall.deb http://mirrors.kernel.org/debian/pool/main/libx/libxp/libxp6_1.0.2-2_amd64.deb \ - && dpkg -i /tmp/toinstall.deb \ - && rm /tmp/toinstall.deb \ - && apt-get install -f \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* \ - && curl -fsSL --retry 5 -o "$TMPDIR/MCRInstaller.bin" https://dl.dropbox.com/s/zz6me0c3v4yq5fd/MCR_R2010a_glnxa64_installer.bin \ + && curl -fL -o "$TMPDIR/MCRInstaller.bin" https://dl.dropbox.com/s/zz6me0c3v4yq5fd/MCR_R2010a_glnxa64_installer.bin \ && chmod +x "$TMPDIR/MCRInstaller.bin" \ - && "$TMPDIR/MCRInstaller.bin" -silent -P installLocation="/opt/matlabmcr-2010a" \ + && "$TMPDIR/MCRInstaller.bin" -silent -P installLocation="/opt/matlab-compiler-runtime-2010a" \ && rm -rf "$TMPDIR" \ && unset TMPDIR \ - && echo "Downloading standalone SPM ..." \ - && curl -fsSL --retry 5 -o /tmp/spm12.zip https://www.fil.ion.ucl.ac.uk/spm/download/restricted/utopia/previous/spm12_r7771_R2010a.zip \ + # Install spm12 + && echo "Downloading standalone SPM12 ..." \ + && curl -fL -o /tmp/spm12.zip https://www.fil.ion.ucl.ac.uk/spm/download/restricted/utopia/previous/spm12_r7771_R2010a.zip \ && unzip -q /tmp/spm12.zip -d /tmp \ && mkdir -p /opt/spm12-r7771 \ && mv /tmp/spm12/* /opt/spm12-r7771/ \ && chmod -R 777 /opt/spm12-r7771 \ && rm -rf /tmp/spm* \ - && /opt/spm12-r7771/run_spm12.sh /opt/matlabmcr-2010a/v713 quit \ - && sed -i '$iexport SPMMCRCMD=\"/opt/spm12-r7771/run_spm12.sh /opt/matlabmcr-2010a/v713 script\"' $ND_ENTRYPOINT - -RUN test "$(getent passwd neuro)" || useradd --no-user-group --create-home --shell /bin/bash neuro -USER neuro - -WORKDIR /home - + # Test + && /opt/spm12-r7771/run_spm12.sh /opt/matlab-compiler-runtime-2010a/v713 quit ENV CONDA_DIR="/opt/miniconda-latest" \ PATH="/opt/miniconda-latest/bin:$PATH" -RUN export PATH="/opt/miniconda-latest/bin:$PATH" \ +RUN yum install -y -q \ + bzip2 \ + curl \ + && yum clean all \ + && rm -rf /var/cache/yum/* \ + # Install dependencies. + && export PATH="/opt/miniconda-latest/bin:$PATH" \ && echo "Downloading Miniconda installer ..." \ && conda_installer="/tmp/miniconda.sh" \ - && curl -fsSL --retry 5 -o "$conda_installer" https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh \ + && curl -fsSL -o "$conda_installer" https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh \ && bash "$conda_installer" -b -p /opt/miniconda-latest \ && rm -f "$conda_installer" \ && conda update -yq -nbase conda \ + && conda install -yq -nbase conda-libmamba-solver \ + && conda config --set solver libmamba \ + # 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 \ - && sync && conda clean -y --all && sync \ - && conda create -y -q --name neuro \ - && conda install -y -q --name neuro \ - "python=3.8" \ - "traits" \ - "jupyter" \ - "nilearn" \ - "graphviz" \ - "nipype" \ - "scikit-image" \ - && sync && conda clean -y --all && sync \ - && bash -c "source activate neuro \ - && pip install --no-cache-dir \ - "matplotlib"" \ - && rm -rf ~/.cache/pip/* \ - && sync \ - && sed -i '$isource activate neuro' $ND_ENTRYPOINT - -ENV LD_LIBRARY_PATH="/opt/miniconda-latest/envs/neuro:" - -RUN bash -c 'source activate neuro' - -USER root - -RUN chmod 777 -Rf /home - -RUN chown -R neuro /home - -USER neuro - + # Enable `conda activate` + && conda init bash \ + && conda install -y --name base \ + "python=3.10" \ + "pip=23.2.1" \ + && bash -c "source activate base \ + && python -m pip install --no-cache-dir \ + "traits==6.3.0" \ + "jupyterlab==4.0.6" \ + "graphviz==0.20.1" \ + "nipype==1.8.6" \ + "scikit-image==0.21.0" \ + "matplotlib==3.8.0" \ + "nilearn==0.10.1"" \ + # Clean up + && sync && conda clean --all --yes && sync \ + && rm -rf ~/.cache/pip/* RUN mkdir -p ~/.jupyter && echo c.NotebookApp.ip = \"0.0.0.0\" > ~/.jupyter/jupyter_notebook_config.py -RUN echo '{ \ - \n "pkg_manager": "apt", \ - \n "instructions": [ \ - \n [ \ - \n "base", \ - \n "neurodebian:stretch-non-free" \ - \n ], \ - \n [ \ - \n "install", \ - \n [ \ - \n "git" \ - \n ] \ - \n ], \ - \n [ \ - \n "fsl", \ - \n { \ - \n "version": "6.0.3" \ - \n } \ - \n ], \ - \n [ \ - \n "afni", \ - \n { \ - \n "version": "latest", \ - \n "method": "binaries", \ - \n "install_r": "true", \ - \n "install_r_pkgs": "true", \ - \n "install_python2": "true", \ - \n "install_python3": "true" \ - \n } \ - \n ], \ - \n [ \ - \n "spm12", \ - \n { \ - \n "version": "r7771", \ - \n "method": "binaries" \ - \n } \ - \n ], \ - \n [ \ - \n "user", \ - \n "neuro" \ - \n ], \ - \n [ \ - \n "workdir", \ - \n "/home" \ - \n ], \ - \n [ \ - \n "miniconda", \ - \n { \ - \n "create_env": "neuro", \ - \n "conda_install": [ \ - \n "python=3.8", \ - \n "traits", \ - \n "jupyter", \ - \n "nilearn", \ - \n "graphviz", \ - \n "nipype", \ - \n "scikit-image" \ - \n ], \ - \n "pip_install": [ \ - \n "matplotlib" \ - \n ], \ - \n "activate": true \ - \n } \ - \n ], \ - \n [ \ - \n "env", \ - \n { \ - \n "LD_LIBRARY_PATH": "/opt/miniconda-latest/envs/neuro:" \ - \n } \ - \n ], \ - \n [ \ - \n "run_bash", \ - \n "source activate neuro" \ - \n ], \ - \n [ \ - \n "user", \ - \n "root" \ - \n ], \ - \n [ \ - \n "run", \ - \n "chmod 777 -Rf /home" \ - \n ], \ - \n [ \ - \n "run", \ - \n "chown -R neuro /home" \ - \n ], \ - \n [ \ - \n "user", \ - \n "neuro" \ - \n ], \ - \n [ \ - \n "run", \ - \n "mkdir -p ~/.jupyter && echo c.NotebookApp.ip = \\\"0.0.0.0\\\" > ~/.jupyter/jupyter_notebook_config.py" \ - \n ] \ - \n ] \ - \n}' > /neurodocker/neurodocker_specs.json +# Save specification to JSON. +RUN printf '{ \ + "pkg_manager": "yum", \ + "existing_users": [ \ + "root" \ + ], \ + "instructions": [ \ + { \ + "name": "from_", \ + "kwds": { \ + "base_image": "centos:7" \ + } \ + }, \ + { \ + "name": "install", \ + "kwds": { \ + "pkgs": [ \ + "git" \ + ], \ + "opts": null \ + } \ + }, \ + { \ + "name": "run", \ + "kwds": { \ + "command": "yum install -y -q \\\\\\n git \\\\\\n && yum clean all \\\\\\n && rm -rf /var/cache/yum/*" \ + } \ + }, \ + { \ + "name": "env", \ + "kwds": { \ + "ANTSPATH": "/opt/ants-2.4.3/", \ + "PATH": "/opt/ants-2.4.3:$PATH" \ + } \ + }, \ + { \ + "name": "run", \ + "kwds": { \ + "command": "yum install -y -q \\\\\\n curl \\\\\\n unzip\\nyum clean all\\nrm -rf /var/cache/yum/*\\necho \\"Downloading ANTs ...\\"\\ncurl -fsSL -o ants.zip https://github.com/ANTsX/ANTs/releases/download/v2.4.3/ants-2.4.3-centos7-X64-gcc.zip\\nunzip ants.zip -d /opt\\nmv /opt/ants-2.4.3/bin/* /opt/ants-2.4.3\\nrm ants.zip" \ + } \ + }, \ + { \ + "name": "env", \ + "kwds": { \ + "FSLDIR": "/opt/fsl-6.0.6.4", \ + "PATH": "/opt/fsl-6.0.6.4/bin:$PATH", \ + "FSLOUTPUTTYPE": "NIFTI_GZ", \ + "FSLMULTIFILEQUIT": "TRUE", \ + "FSLTCLSH": "/opt/fsl-6.0.6.4/bin/fsltclsh", \ + "FSLWISH": "/opt/fsl-6.0.6.4/bin/fslwish", \ + "FSLLOCKDIR": "", \ + "FSLMACHINELIST": "", \ + "FSLREMOTECALL": "", \ + "FSLGECUDAQ": "cuda.q" \ + } \ + }, \ + { \ + "name": "run", \ + "kwds": { \ + "command": "yum install -y -q \\\\\\n bc \\\\\\n curl \\\\\\n file \\\\\\n libGL \\\\\\n libGLU \\\\\\n libICE \\\\\\n libSM \\\\\\n libX11 \\\\\\n libXcursor \\\\\\n libXext \\\\\\n libXft \\\\\\n libXinerama \\\\\\n libXrandr \\\\\\n libXt \\\\\\n libgomp \\\\\\n libjpeg \\\\\\n libmng \\\\\\n libpng12 \\\\\\n nano \\\\\\n openblas-serial \\\\\\n python3 \\\\\\n sudo \\\\\\n wget\\nyum clean all\\nrm -rf /var/cache/yum/*\\n\\necho \\"Installing FSL ...\\"\\ncurl -fsSL https://fsl.fmrib.ox.ac.uk/fsldownloads/fslconda/releases/fslinstaller.py | python3 - -d /opt/fsl-6.0.6.4 -V 6.0.6.4" \ + } \ + }, \ + { \ + "name": "env", \ + "kwds": { \ + "FORCE_SPMMCR": "1", \ + "SPM_HTML_BROWSER": "0", \ + "SPMMCRCMD": "/opt/spm12-r7771/run_spm12.sh /opt/matlab-compiler-runtime-2010a/v713 script", \ + "LD_LIBRARY_PATH": "$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu:/opt/matlab-compiler-runtime-2010a/v713/runtime/glnxa64:/opt/matlab-compiler-runtime-2010a/v713/bin/glnxa64:/opt/matlab-compiler-runtime-2010a/v713/sys/os/glnxa64:/opt/matlab-compiler-runtime-2010a/v713/extern/bin/glnxa64", \ + "MATLABCMD": "/opt/matlab-compiler-runtime-2010a/v713/toolbox/matlab" \ + } \ + }, \ + { \ + "name": "run", \ + "kwds": { \ + "command": "export TMPDIR=\\"$\(mktemp -d\)\\"\\nyum install -y -q \\\\\\n bc \\\\\\n curl \\\\\\n libXext \\\\\\n libXmu \\\\\\n libXpm \\\\\\n libXt \\\\\\n unzip\\nyum clean all\\nrm -rf /var/cache/yum/*\\necho \\"Downloading MATLAB Compiler Runtime ...\\"\\ncurl -fL -o \\"$TMPDIR/MCRInstaller.bin\\" https://dl.dropbox.com/s/zz6me0c3v4yq5fd/MCR_R2010a_glnxa64_installer.bin\\nchmod +x \\"$TMPDIR/MCRInstaller.bin\\"\\n\\"$TMPDIR/MCRInstaller.bin\\" -silent -P installLocation=\\"/opt/matlab-compiler-runtime-2010a\\"\\nrm -rf \\"$TMPDIR\\"\\nunset TMPDIR\\n# Install spm12\\necho \\"Downloading standalone SPM12 ...\\"\\ncurl -fL -o /tmp/spm12.zip https://www.fil.ion.ucl.ac.uk/spm/download/restricted/utopia/previous/spm12_r7771_R2010a.zip\\nunzip -q /tmp/spm12.zip -d /tmp\\nmkdir -p /opt/spm12-r7771\\nmv /tmp/spm12/* /opt/spm12-r7771/\\nchmod -R 777 /opt/spm12-r7771\\nrm -rf /tmp/spm*\\n# Test\\n/opt/spm12-r7771/run_spm12.sh /opt/matlab-compiler-runtime-2010a/v713 quit" \ + } \ + }, \ + { \ + "name": "env", \ + "kwds": { \ + "CONDA_DIR": "/opt/miniconda-latest", \ + "PATH": "/opt/miniconda-latest/bin:$PATH" \ + } \ + }, \ + { \ + "name": "run", \ + "kwds": { \ + "command": "yum install -y -q \\\\\\n bzip2 \\\\\\n curl\\nyum clean all\\nrm -rf /var/cache/yum/*\\n# Install dependencies.\\nexport PATH=\\"/opt/miniconda-latest/bin:$PATH\\"\\necho \\"Downloading Miniconda installer ...\\"\\nconda_installer=\\"/tmp/miniconda.sh\\"\\ncurl -fsSL -o \\"$conda_installer\\" https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\\nbash \\"$conda_installer\\" -b -p /opt/miniconda-latest\\nrm -f \\"$conda_installer\\"\\nconda update -yq -nbase conda\\nconda install -yq -nbase conda-libmamba-solver\\nconda config --set solver libmamba\\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.10\\" \\\\\\n \\"pip=23.2.1\\"\\nbash -c \\"source activate base\\n python -m pip install --no-cache-dir \\\\\\n \\"traits==6.3.0\\" \\\\\\n \\"jupyterlab==4.0.6\\" \\\\\\n \\"graphviz==0.20.1\\" \\\\\\n \\"nipype==1.8.6\\" \\\\\\n \\"scikit-image==0.21.0\\" \\\\\\n \\"matplotlib==3.8.0\\" \\\\\\n \\"nilearn==0.10.1\\"\\"\\n# Clean up\\nsync && conda clean --all --yes && sync\\nrm -rf ~/.cache/pip/*" \ + } \ + }, \ + { \ + "name": "run", \ + "kwds": { \ + "command": "mkdir -p ~/.jupyter && echo c.NotebookApp.ip = \\\\\\"0.0.0.0\\\\\\" > ~/.jupyter/jupyter_notebook_config.py" \ + } \ + } \ + ] \ +}' > /.reproenv.json +# End saving to specification to JSON. diff --git a/INSTALL.md b/INSTALL.md index f1589893..a0b7dbd3 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -52,25 +52,19 @@ docker images The Dockerfile used to create the image stored on DockerHub is available at the root of the repository ([Dockerfile](Dockerfile)). But you might want to personalize this Dockerfile. To do so, change the command below that will generate a new Dockerfile: ```bash -docker run --rm repronim/neurodocker:0.7.0 generate docker \ - --base neurodebian:stretch-non-free --pkg-manager apt \ - --install git \ - --fsl version=6.0.3 \ - --afni version=latest method=binaries install_r=true install_r_pkgs=true install_python2=true install_python3=true \ - --spm12 version=r7771 method=binaries \ - --user=neuro \ - --workdir /home \ - --miniconda create_env=neuro \ - conda_install="python=3.8 traits jupyter nilearn graphviz nipype scikit-image" \ - pip_install="matplotlib" \ - activate=True \ - --env LD_LIBRARY_PATH="/opt/miniconda-latest/envs/neuro:$LD_LIBRARY_PATH" \ - --run-bash "source activate neuro" \ - --user=root \ - --run 'chmod 777 -Rf /home' \ - --run 'chown -R neuro /home' \ - --user=neuro \ - --run 'mkdir -p ~/.jupyter && echo c.NotebookApp.ip = \"0.0.0.0\" > ~/.jupyter/jupyter_notebook_config.py' > Dockerfile + neurodocker generate docker \ + --base-image centos:7 --pkg-manager yum \ + --yes \ + --install git \ + --ants method=binaries version=2.4.3 \ + --fsl version=6.0.6.4 \ + --spm12 version=r7771 method=binaries \ + --miniconda method=binaries \ + version=latest \ + mamba=true \ + conda_install="python=3.10 pip=23.2.1" \ + pip_install="traits==6.3.0 jupyterlab==4.0.6 graphviz==0.20.1 nipype==1.8.6 scikit-image==0.21.0 matplotlib==3.8.0 nilearn==0.10.1" \ + --run 'mkdir -p ~/.jupyter && echo c.NotebookApp.ip = \"0.0.0.0\" > ~/.jupyter/jupyter_notebook_config.py' > Dockerfile ``` When you are satisfied with your Dockerfile, just build the image: diff --git a/circleci/build_docker.sh b/circleci/build_docker.sh new file mode 100644 index 00000000..2123338e --- /dev/null +++ b/circleci/build_docker.sh @@ -0,0 +1,27 @@ +#! /bin/bash + +set -eux -o pipefail + +# used to build the Docker image for a project in circle CI +# +# assumes that the docker has been cached in ${HOME}/docker/image.tar +# +# - save_cache: +# key: my_cache +# paths: +# - ~/docker +# - ~/data +# + +# make sure we have a lowercase repo +user_name="remi-gau" +repo_name=$(echo "${CIRCLE_PROJECT_REPONAME}" | tr '[:upper:]' '[:lower:]') + +if [[ -e "${HOME}/docker/image.tar" ]]; then + docker load -i "${HOME}/docker/image.tar" +fi +git describe --tags --always > version +docker build -t "${user_name}/${repo_name}" . +mkdir -p "${HOME}/docker" +docker save "${user_name}/${repo_name}" > "${HOME}/docker/image.tar" +docker images diff --git a/circleci/push_docker.sh b/circleci/push_docker.sh new file mode 100644 index 00000000..d3ff9ec2 --- /dev/null +++ b/circleci/push_docker.sh @@ -0,0 +1,29 @@ +#! /bin/bash + +set -ex -o pipefail + +# used to push the Docker image for a project in circle CI + +if [[ -n "${DOCKER_TOKEN}" ]]; then + + # make sure we have a lowercase repo + user_name="remi-gau" + repo_name=$(echo "${CIRCLE_PROJECT_REPONAME}" | tr '[:upper:]' '[:lower:]') + + echo "${DOCKER_TOKEN}" | docker login -u "${DOCKER_USER}" --password-stdin + + : "Pushing to DockerHub ${user_name}/${repo_name}:unstable" + docker tag "${user_name}/${repo_name}" "${user_name}/${repo_name}:unstable" + docker push "${user_name}/${repo_name}:unstable" + + if [[ -n "${CIRCLE_TAG}" ]]; then + : "Pushing to DockerHub ${user_name}/${repo_name}:${CIRCLE_TAG}" + docker push "${user_name}/${repo_name}:latest" + docker tag "${user_name}/${repo_name}" "${user_name}/${repo_name}:${CIRCLE_TAG}" + docker push "${user_name}/${repo_name}:${CIRCLE_TAG}" + fi + +else + : "No DOCKER_TOKEN, skipping push to DockerHub" + exit 1 +fi diff --git a/environment.yml b/environment.yml index e2fa4b95..d7f83495 100644 --- a/environment.yml +++ b/environment.yml @@ -3,13 +3,13 @@ channels: - conda-forge - defaults dependencies: - - python=3.8.0 - - pip - - traits - - jupyter - - nilearn - - graphviz - - nipype - - scikit-image + - python=3.10 + - pip=23.2.1 - pip: - - matplotlib + - traits==6.3.0 + - jupyter + - graphviz + - nipype==1.8.6 + - scikit-image==0.21.0 + - matplotlib==3.8.0 + - nilearn==0.10.1 diff --git a/makefile b/makefile new file mode 100644 index 00000000..c73c7ac7 --- /dev/null +++ b/makefile @@ -0,0 +1,20 @@ +.PHONY: Dockerfile + +# docker run --rm repronim/neurodocker:0.9.5 generate docker + +# using the mamba option requires to use the version of neurodocker +# installed from the main branch of the the neurodocker github repo +Dockerfile: + neurodocker generate docker \ + --base-image centos:7 --pkg-manager yum \ + --yes \ + --install git \ + --ants method=binaries version=2.4.3 \ + --fsl version=6.0.6.4 \ + --spm12 version=r7771 method=binaries \ + --miniconda method=binaries \ + version=latest \ + mamba=true \ + conda_install="python=3.10 pip=23.2.1" \ + pip_install="traits==6.3.0 jupyterlab==4.0.6 graphviz==0.20.1 nipype==1.8.6 scikit-image==0.21.0 matplotlib==3.8.0 nilearn==0.10.1" \ + --run 'mkdir -p ~/.jupyter && echo c.NotebookApp.ip = \"0.0.0.0\" > ~/.jupyter/jupyter_notebook_config.py' > Dockerfile \ No newline at end of file