Create docker image¶
Docker can help us to maintain our computational environments. Each of our Nextflow pipeline has a dedicated docker image in our lab. And all the docker files should be avalible at dockerfile.
Dockerfile¶
To simplify the image building, we can use conda to install most of the tools. We can collect the tools available on conda cloud into a conda.yml
file, which might looks like this.
name: concordance-nf
channels:
- defaults
- bioconda
- r
- biobuilds
- conda-forge
dependencies:
- bwa=0.7.17
- sambamba=0.7.0
- samtools=1.9
- picard=2.20.6
- bcftools=1.9
# - vcfkit=0.1.6
- csvtk=0.18.2
- r=3.6.0
- r-ggplot2=3.1.1
- r-readr=1.3.1
- r-tidyverse=1.2.1
Then, build the Dockerfile
as below.
FROM continuumio/miniconda
MAINTAINER XXX <email>
COPY conda.yml .
RUN \
conda env update -n root -f conda.yml \
&& conda clean -a
# install other tools not avalible on conda cloud -- tidyverse sometimes need to be installed here separately...
RUN apt-get update && apt-get install -y procps
RUN R -e "install.packages('roperators',dependencies=TRUE, repos='http://cran.us.r-project.org')"
Note
Put the conda.ymal
and Dockerfile
under the same folder.
Build docker image¶
To build the docker image, you need docker desktop installed on your local machine. Also you should sign up the dockerhub to enable pushing docker image to cloud.
Go to the folder which have conda.ymal
and Dockerfile
, run
docker build -t <dockerhub account>/<name of the image> . # don't ingore the dot here
You can use docker image ls
to check the image list you have in your local machine.
Importantly, you have to check if the tools were installed sucessfully in your docker image. To test the docker image, run
docker run -ti <dockerhub account>/<name of the image> sh
The above command will let you into the docker image, where you can check the tools by their normal commands. Make sure all the tools you need have been installed appropriately.
Tag image with a version¶
There are sometimes issues with Nextflow thinking it has the latest docker image when it really doesn't. To avoid this issue, it is useful to tag each updated docker image with a version tag. Remember to update the docker call in nextflow to use the new version!
docker image tag <dockerhub account>/<name of the image>:latest <dockerhub account>/<name of the image>:<version tag>
Push docker image to dockerhub¶
After the image check, you are ready to push the image to dockerhub which allows you to download the image when ever you need to use.
docker push <dockerhub account>/<name of the image>:<version tag>
Running Nextflow with docker¶
If running Nextflow locally, a docker container can be used with the following line (check out the documentation):
nextflow run <your script> -with-docker [docker image]
Alternatively, a docker container can be specified within the nextflow.config
script to avoid adding an extra parameter:
process.container = 'nextflow/examples:latest'
docker.enabled = true
// if on quest:
// singularity.enabled = true
Important
When running Nextflow with a docker container on QUEST, it is necessary to replace the docker
command with singularity
(although you still must build a docker container). You must also load singularity using module load singularity
before starting a run.