linux 在docker镜像的WORKDIR中找不到文件

lo8azlld  于 2023-06-21  发布在  Linux
关注(0)|答案(2)|浏览(225)

我使用以下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和容器完全兼容。

mwg9r5ms

mwg9r5ms1#

创建您自己的 Package 器脚本(如第一个示例中所示)通常被认为是一种更干净、更灵活的解决方案。下面是使用continuumio/miniconda3映像的一种方法:

FROM continuumio/miniconda3

RUN git clone https://github.com/eliza-m/NLRexpress /opt/NLRexpress
WORKDIR /opt/NLRexpress

RUN conda update conda -y

RUN conda env create -f environment.yml \
    && conda clean --all -y

RUN conda install -c bioconda hmmer \
    && conda clean --all -y

ARG CONDA_ENV_NAME=nlrexpress
RUN echo "conda activate ${CONDA_ENV_NAME}" >> ~/.bashrc
ENV PATH "/opt/conda/envs/${CONDA_ENV_NAME}/bin:${PATH}"

ARG NLREXPRESS=/usr/local/bin/nlrexpress
RUN echo '#!/bin/bash' >> "${NLREXPRESS}" \
    && echo 'python /opt/NLRexpress/nlrexpress.py "$@"' >> "${NLREXPRESS}" \
    && chmod +x "${NLREXPRESS}"

ARG SPLITFASTA=/usr/local/bin/splitFasta
RUN echo '#!/bin/bash' >> "${SPLITFASTA}" \
    && echo 'python /opt/NLRexpress/splitFasta.py "$@"' >> "${SPLITFASTA}" \
    && chmod +x "${SPLITFASTA}"

RUN wget https://nlrexpress.biochim.ro/datasets/models.tar.gz \
    && tar xf models.tar.gz \
    && rm models.tar.gz

CMD ["bash"]
1yjd4xko

1yjd4xko2#

我仍然在努力掌握docker的工作原理,但我找到了一个解决方案,以防其他人也有同样的问题。
首先,我尝试给予可执行文件nlrexpress提供python脚本的完整路径:

RUN echo "#!/bin/bash \n python /usr/local/src/NLRexpress/nlrexpress.py" > nlrexpress && \
    chmod +x nlrexpress

但这最终导致执行命令并忽略随后的输入参数。
相反,我通过shebang指出了需要哪个二进制文件,这样python脚本本身就可以执行,而不需要编写python script.py

RUN sed  -i '1i #!/opt/conda/envs/nlrexpress/bin/python' nlrexpress.py && \
    chmod +x nlrexpress.py

相关问题