Dockerfiles to support:
- developing FreeSurfer (compiling FreeSurfer from source)
- running development versions of FreeSurfer (using locally compiled FreeSurfer binaries)
- running prepackaged versions of FreeSurfer (using pre-built development versions, or released packages of FreeSurfer)
The freesufer-build
container is used to build the dev branch of FreeSurfer and is based on Ubuntu 16.04.3 LTS (Xenial Xerus). It is built from the file build/Dockerfile
- Install docker
- Install git
- Install git-annex
Outside the container, we want to make a directory structure that looks like:
└── fs-development
├── bin
├── freesurfer
├── fs-docker
└── packages
Where:
./fs-development/bin/
is where the compiled FreeSurfer binaries will be installed withmake install
./fs-development/freesurfer
is the FreeSurfer repo./fs/packages
is the required pre-compiled depedencies./fs-development/fs-docker
is this repo.
The fs-development
directory will get mounted to /fs
inside the container when it is executed.
mkdir -p ~/fs-development/bin
cd ~/fs-development
wget http://surfer.nmr.mgh.harvard.edu/pub/data/fspackages/prebuilt/centos7-packages.tar.gz
tar zxvf centos7-packages.tar.gz
git clone https://github.com/freesurfer/freesurfer.git ./freesurfer
cd ./freesurfer
git checkout dev
You can compile FreeSurfer now, but if you want to install/run it, some additional files are needed:
git remote add datasrc https://surfer.nmr.mgh.harvard.edu/pub/dist/freesurfer/repo/annex.git
git fetch datasrc
git annex enableremote datasrc
git annex get --metadata fstags=makecheck . && git annex get --metadata fstags=makeinstall .
If the annex tags haven't been updated, you might need to run
git annex get .
make fs-build
Mount the fs-development
directory to /fs
inside the container; make /fs
the working directory and preserve UID/GID
cd ~
docker run -it --rm \
-v ${PWD}/fs-development:/fs \
-w /fs \
-u ${UID}:${GID} \
corticometrics/freesurfer-build:latest \
/bin/bash
You should now have an interactive terminal inside the container.
From inside the container, run:
cd ./freesurfer
rm -f CMakeCache.txt
cmake -DFS_PACKAGES_DIR="/fs/packages" -DBUILD_GUIS=OFF .
make -j 4
If you've run git annex get --metadata fstags=makeinstall .
above, you should be able to:
make install
This should install FreeSurfer to /fs/bin
(inside the container)
Now, type exit
to exit the container. Since ~/fs-development/bin
was mounted inside the container to /fs/bin
, you should now have a full FreeSurfer install dir at ~/fs-development/bin
The freesurfer-run
container is used to run dev branch version of recon-all
and is based on Ubuntu 16.04.3 LTS (Xenial Xerus). It is built from the file run/Dockerfile
- Install docker
- Obtain FreeSurfer binaries (either by following the steps above to compile or download)
- Obtain FreeSurfer subject data to recon
- Obtain FreeSurfer license (from here)
make fs-run
The entrypoint script for this container looks for the environment variable FS_KEY
and, if present, will base64-decode the string and store the contents in the file $FREESURFER_HOME/license.txt
. Most of FreeSurfer will not work without this license file.
Obtaining a license file is free and can be applied for here. Once you have the license file, run cat $FREESURFER_HOME/license.txt |base64 -w 0 && echo
to get the string that you should set the FS_KEY
environment variable to.
The freesurfer-run
container expects:
- 2 volumes to be mounted.
- The FreeSurfer install directory (
$FREESURFER_HOME
) should be mounted to/freesurfer-bin
- The FreeSurfer subjects directory (
$SUBJECTS_DIR
) should be mounted to/subjects
- The FreeSurfer install directory (
- The
FS_KEY
environment variable is set to the base64-encoded string of the FreeSurfer license file
Suppose:
- The FreeSurfer install directory lives at
~/fs-development/bin
- The FreeSurfer subject directory lives at
/tmp/subjects/
- The FreeSurfer subject directory contains the subdirectory
bert
, which you would like to recon
- The FreeSurfer subject directory contains the subdirectory
- The
FS_KEY
value isxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Then, the following command will run recon-all on bert:
docker run -it --rm \
-v ${HOME}/fs-development/bin:/freesurfer-bin \
-v /tmp/subjects/:/subjects \
-e FS_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
-u ${UID}:${GID} \
corticometrics/freesurfer-run:latest \
recon-all -all -s bert