Отредактируйте в Dockerfile, чтобы изображение запускалось не в интерактивной оболочке, а из ENTRYPOINT - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь использовать образ докера определенного программного обеспечения ( picard ), и этот образ предназначен для интерактивного запуска, фактически уже созданный образ докера предоставляется через Dockerhub:

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] ...

Насколько я понимаю, это можно сделать, создав ENTRYPOINT в Dockerfile (см. в приложении ниже), но addind следующая строка в нижней части 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. Он выглядит следующим образом:

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 ]

1 голос
/ 30 сентября 2019

Проблема в том, как определяется ENTRYPOINT.

Это должно быть

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

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

0 голосов
/ 30 сентября 2019

Я только что узнал о другой возможной альтернативе, которая не требует изменения исходного файла docker, который переопределяет значение по умолчанию ENTRYPOINT из CLI (даже если исходное изображение не определяет его).

Этоможет быть сделано с параметром --entrypoint, но он будет принимать только имя файла, который будет выполнен в изображении. Если необходимо использовать дополнительные аргументы, они должны быть вызваны после имени изображения. Например:

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

Этот блог объясняет немного больше по теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...