在Dockerfile中进行编辑,以使映像不在交互式shell中运行,而是在ENTRYPOINT中运行

时间:2019-09-30 13:27:48

标签: docker

我正在尝试使用特定软件(picard)的docker镜像,并且该镜像旨在以交互方式运行,实际上,已经通过Dockerhub提供了一个已构建的docker镜像:

docker pull broadinstitute/picard

此图像将在以下命令中完美运行:

sudo docker run -i -t -v $PWD:/usr/working broadinstitute/picard

这样一来,您可以在图像中启动实际程序,例如:

java -jar /usr/picard/picard.jar [COMMAND] [OPTIONS] ...

我要完成的工作是在不输入交互式外壳的情况下执行此图像,就像这样:

sudo docker run --rm -v $PWD:/usr/working broadinstitute/picard [COMMAND] [OPTIONS] ...

据我所知,可以通过在Dockerfile中创建一个ENTRYPOINT来完成此操作(请参阅下面的附录),但是在Dockerfile底部添加以下行将无效:

ENTRYPOINT ["java -jar /usr/picard/picard.jar"]

相反,当我如上所述运行图像时,不会生成任何输出,并且如果调用了特定命令(例如CreateSequenceDictionary),则会出现以下错误:

  

docker:来自守护程序的错误响应:OCI运行时创建失败:container_linux.go:345:启动容器进程导致“ exec:\“ CreateSequenceDictionary \”:在$ PATH中找不到可执行文件”:未知。

我想念什么?

Dockerfile

可以在github仓库中的https://github.com/broadinstitute/picard/blob/master/Dockerfile中找到dockerfile。看起来如下:

FROM openjdk:8
MAINTAINER Broad Institute DSDE <dsde-engineering@broadinstitute.org>

ARG build_command=shadowJar
ARG jar_name=picard.jar

# Install ant, git for building
RUN apt-get update && \
    apt-get --no-install-recommends install -y --force-yes \
        git \
        r-base \
        ant && \
    apt-get clean autoclean && \
    apt-get autoremove -y

# Assumes Dockerfile lives in root of the git repo. Pull source files into container
COPY / /usr/picard/
WORKDIR /usr/picard

# Build the distribution jar, clean up everything else
RUN ./gradlew ${build_command} && \
    mv build/libs/${jar_name} picard.jar && \
    ./gradlew clean && \
    rm -rf src && \
    rm -rf gradle && \
    rm -rf .git && \
    rm gradlew && \
    rm build.gradle

RUN mkdir /usr/working
WORKDIR /usr/working

2 个答案:

答案 0 :(得分:1)

问题在于ENTRYPOINT的定义方式。

应该是

ENTRYPOINT ["java", "-jar", "/usr/picard/picard.jar"]

src:https://docs.docker.com/v17.09/engine/reference/builder/#entrypoint

答案 1 :(得分:0)

我刚刚了解了不需要修改原始dockerfile的其他可能替代方案,该替代方案覆盖了CLI中的默认ENTRYPOINT(即使原始映像未定义一个)。

这可以通过--entrypoint选项来完成,但是它将仅使用要在映像中执行的文件的名称。如果要使用其他参数,则必须在映像名称之后调用这些参数。例如:

docker run --entrypoint="java" $PWD:/usr/working broadinstitute/picard -jar /usr/picard/picard.jar [COMMAND] [OPTIONS]

blog对该主题进行了更多解释。