【问题标题】:Command not found in docker image [closed]在 docker 映像中找不到命令 [关闭]
【发布时间】:2020-11-06 03:07:07
【问题描述】:

我正在尝试使用 docker 映像在 LSF 集群上运行此命令。但是,我不断收到以下错误。有人可以帮我解决这个问题吗?

命令:

export CUR_STEP="/usr/local/bbmap/demuxbyname.sh"; \
MEM=100; \
export sortedFQ="${BASE}/WXS_Aquilla/01-RAW/${PR}/${FULLSM}/paire_test_sorted.fastq"; \
export column=2; \
export DELIM=":"; \
export COLNUM=2; \
export sampleFQ="${BASE}/WXS_Aquilla/01-RAW/${PR}/${FULLSM}/ADNI_1380"
bsub \
-J "${FULLSM}_bbduk_demulti" \
-o "${BASE}/WXS_Aquilla/01-RAW/${PR}/${FULLSM}/${FULLSM}.${BAMBASE}_bbduk_demulti.%J" \
-u "${EMAIL}" \
-n1 -W 1440 \
-R "rusage[mem=120192]" \
-q research-hpc \
-a 'docker(an/bbduk:latest)' \
entrypoint.sh; 

错误:

Status: Downloaded newer image for an/bbduk:latest
[20201106_025413] /usr/local/bbmap/demuxbyname.sh starting
java -ea -Xmx100g -Xms100g -cp /usr/local/bbmap/current/ jgi.DemuxByName2 -Xmx100g in=/gscmnt/gc2645/wgs/WXS_Aquilla/01-RAW/ADNI_WGS/ADNI_1380^LP6005117-DNA_G04^ADNI_WGS/paire_test_sorted.fastq delimiter=: column=2 out=/gscmnt/gc2645/wgs/WXS_Aquilla/01-RAW/ADNI_WGS/ADNI_1380^LP6005117-DNA_G04^ADNI_WGS/ADNI_1380%_#.fq
/usr/local/bbmap/demuxbyname.sh: line 149: java: command not found
Command exited with non-zero status 127
        Command being timed: "/usr/local/bbmap/demuxbyname.sh -Xmx100g in=/gscmnt/gc2645/wgs/WXS_Aquilla/01-RAW/ADNI_WGS/ADNI_1380^LP6005117-DNA_G04^ADNI_WGS/paire_test_sorted.fastq delimiter=: column=2 out=/gscmnt/gc2645/wgs/WXS_Aquilla/01-RAW/ADNI_WGS/ADNI_1380^LP6005117-DNA_G04^ADNI_WGS/ADNI_1380%_#.fq"

我的 docker 文件如下所示:

FROM openjdk:8-jre
LABEL maintainer="AN <XXX@XXX.edu>"

LABEL org.label-schema.schema-version="1.0"
# LABEL org.label-schema.build-date=$BUILD_DATE
LABEL org.label-schema.name="XXX/bbduk"
LABEL org.label-schema.description="Image for creating interleaved fastq"

ENV BBMAP_VERSION 38.87
ENV BBMAP_DIR /usr/local/bbmap

WORKDIR /tmp

RUN apt-get update -y \
&& apt-get install --no-install-recommends -y \
 make \
 gcc \
 g++ \
 libz-dev \
 libbz2-dev \
 liblzma-dev \
 ncurses-dev \
 bc \
 libnss-sss \
 time 


WORKDIR /usr/local
RUN set -eux; \
       wget -O bbmap.tar.gz https://sourceforge.net/projects/bbmap/files/BBMap_${BBMAP_VERSION}.tar.gz/download \
    && tar -zxf bbmap.tar.gz \
    && rm bbmap.tar.gz 

COPY ./entrypoint.sh /usr/local/bin/

## Add ENV for Shell scripts from BBMAP
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
# CMD ["/bin/bash"]

入口点.sh

  #!/bin/bash
    PATH=${BBMAP_DIR}:$PATH}
    
    VERSION="2.0"
    
    DATE="/bin/date +%s"
    display_date () {
        /bin/date -d @${1} +%Y%m%d_%H%M%S
    }
    
    date_diff () {
        earlier=${1}
        later=${2}
        diff=$((${later}-${earlier}))
        if [ ${diff} -gt 86400 ]; then
            date -u -d @$((${diff}-86400)) +"%jd%-Hh%-Mm%-Ss"
        else
            date -u -d @${diff} +"%-Hh%-Mm%-Ss"
        fi
    }
    
    quit () {
      echo "[$(display_date $(${DATE}))] Run failed at ${1} step, exit code: 1"
      # /bin/mail -r "docker@${HOSTNAME}" -s "${SYSTEM}: ${BAMFILE} FAIL at ${1} (${PBS_JOBID}${SLURM_JOBID}${LSB_JOBID})" "${EMAIL}" < /dev/null > /dev/null
      if [ "${SHELLDROP}" -eq 1 ]; then echo "Dropping to shell"; exec "/bin/bash"; else exit 1; fi
    }
    
    # trap "{ echo \"[$(display_date $(${DATE}))] Terminated by SIGTERM \"; quit \"${CUR_STEP}\"; }" SIGTERM
    trap "echo \"[$(display_date $(${DATE}))] Terminated by SIGTERM \" && sleep 10s" SIGTERM
    
    
    if [ ! -z "${TIMING}" ]; then TIMING=(/usr/bin/time -v); fi
    
    
    
    start=$(${DATE}); echo "[$(display_date ${start})] ${CUR_STEP} starting"
    "${TIMING[@]}" "${CUR_STEP}" -Xmx${MEM}g in=${sortedFQ} delimiter=${DELIM} column=${COLNUM} out=${sampleFQ}%_#.fq
    exitcode=$?
    end=$(${DATE}); echo "[$(display_date ${end})] ${CUR_STEP} finished, exit code: ${exitcode}, step time $(date_diff ${start} ${end})"
    exit ${exitcode}

【问题讨论】:

    标签: linux bash docker shell


    【解决方案1】:

    这个命令...

    ENV PATH ${BBMAP_DIR}:${PATH}
    

    ...在 Docker 守护进程的上下文中进行评估,因此对 ${PATH} 的引用获取在 Docker 守护进程的环境中可见的任何值,而不是在正在运行的容器中可见的 ${PATH}。由于java 命令位于/usr/local/openjdk-8/bin/java 中,因此您有效地隐藏了它。

    不要通过 Docker ENV 命令设置 PATH

    修改您的 /usr/local/bin/entrypoint.sh 脚本来代替:

    #!/bin/sh
    
    [...]
    
    PATH=${BBMAP_DIR}:${PATH}
    
    [...]
    

    【讨论】:

    • 再次出现同样的错误。我删除了ENV PATH ${BBMAP_DIR}:${PATH} 并将PATH=${BBMAP_DIR}:$PATH} 添加到entrypoint.sh,但仍然出现相同的错误。
    • 更新您的问题以显示 (a) 您的 entrypoint.sh 和 (b) $PATH 的值,方法是在运行生成错误的命令之前调用 echo $PATH
    • 请看entrypoint.sh。如何获得回声 $PATH?我在集群上运行它。
    • 您的entrypoint.sh 中有错字。你错过了{。你有PATH=${BBMAP_DIR}:$PATH},但你想要PATH=${BBMAP_DIR}:${PATH}
    • 不知道为什么,我现在收到这个错误:trap: SIGTERM: bad trap /usr/local/bin/entrypoint.sh: 52: /usr/local/bin/entrypoint.sh: Syntax error: "(" unexpected (expecting "fi")
    猜你喜欢
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2018-06-06
    • 1970-01-01
    • 2014-09-10
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多