我使用以下Dockerfile
创建了一个docker镜像:
FROM ubuntu:18.04
ARG DEBIAN_FRONTEND=noninteractive
WORKDIR /usr/local/src
# Setting up general environment
RUN apt-get -y update \
&& apt-get install -y build-essential \
&& apt-get install -y wget \
&& apt-get install -y hmmer \
&& apt-get install -y git \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
## Installing miniconda
ENV CONDA_DIR /opt/conda
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \
/bin/bash ~/miniconda.sh -b -p /opt/conda
ENV PATH=$CONDA_DIR/bin:$PATH
# Installing NLRTracker
RUN git clone https://github.com/eliza-m/NLRexpress
WORKDIR /usr/local/src/NLRexpress
# Setting up the conda environment and required variables
RUN conda env create -f environment.yml && \
conda init bash && \
echo "conda activate nlrexpress" >> ~/.bashrc
ENV PATH /opt/conda/envs/nlrexpress/bin:/usr/local/src/NLRexpress:$PATH
ENV CONDA_DEFAULT_ENV nlrexpress
RUN wget https://nlrexpress.biochim.ro/datasets/models.tar.gz && \
tar -xf models.tar.gz && \
rm models.tar.gz
RUN echo "#!/bin/bash \n python nlrexpress.py" > nlrexpress && \
chmod +x nlrexpress
我避免使用CMD
参数,并创建了一个可执行文件nlrexpress
,因为我也想将此映像用于hmmsearch
。
镜像构建得很好,当我测试docker run nlrexpress:latest nlrexpress
时,我得到了预期的输出:
Usage: nlrexpress.py [OPTIONS]
Try 'nlrexpress.py --help' for help.
Error: Missing option '--input'.
但是,当我将容器与nextflow一起使用时,我得到以下错误:python: can't open file '/path/to/workDir/ea/72bd9e660d0ce79944d8bdde3dd024/nlrexpress.py': [Errno 2] No such file or directory
下面是nextflow流程:
process NLRexpress {
tag "$sample_id"
publishDir params.PlantDir
maxForks 1
container = 'dthorbur1990/nlrexpress:latest'
executor = "local"
input:
tuple val(sample_id), path(peptides)
output:
path "*.short.output.txt"
script:
"""
mkdir output
nlrexpress \\
--input ../${peptides} \\
--outdir ./output \\
--module ${params.NE_Modules}
mv output/*.short.output.txt ./
"""
}
如何确保挂载容器时容器WORKDIR
中的文件可用?我试过设置ENV
变量,但这似乎也不起作用。我认为因为设置了WORKDIR
,所以映像将始终挂载到WORKDIR
路径,并且所有文件都将可用。
我发现我可以将repo克隆到nextflow工作目录中,但这不是一个理想的解决方法,因为我还必须为每个进程下载模型。我下载到容器中的models
目录也存在同样的问题。
**编辑:只需要添加hmmsearch
与nextflow和容器完全兼容。
2条答案
按热度按时间mwg9r5ms1#
创建您自己的 Package 器脚本(如第一个示例中所示)通常被认为是一种更干净、更灵活的解决方案。下面是使用continuumio/miniconda3映像的一种方法:
1yjd4xko2#
我仍然在努力掌握docker的工作原理,但我找到了一个解决方案,以防其他人也有同样的问题。
首先,我尝试给予可执行文件
nlrexpress
提供python脚本的完整路径:但这最终导致执行命令并忽略随后的输入参数。
相反,我通过shebang指出了需要哪个二进制文件,这样python脚本本身就可以执行,而不需要编写
python script.py
。