Передача нескольких classFile в качестве аргумента в Dockerfile - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть такой Dockerfile:

FROM java:8
ARG cName
ADD target/jar1.jar p2p.jar
ADD ci/docker_entrypoint.sh .
CMD ["bash", "docker_entrypoint.sh" , "$cName"]

У меня есть docker_entrypoint.sh, который выглядит так:

java -cp p2p.jar $1

У меня есть несколько классов для запуска, и я предоставляю className в качестве вводапараметр для dockerfile.Я запускаю несколько команд для сборки и запуска Docker.

docker build -f Dockerfile -t docker-p2p --build-arg cName=com.HelloWorld .
docker run docker-p2p

после выполнения второй команды я получаю сообщение об ошибке ниже:

Error: Could not find or load main class $cName

Я новичок в Docker, и я невозможность параметризации с помощью dockerfile, но когда я упоминаю имя класса "HelloWorld" в файле dockerfile, он работает хорошо.Но когда я пытаюсь передать параметры, он выбрасывает меня с этой ошибкой.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вы должны различаться между докером run , cmd и точка входа .

В качестве примера вы можете использовать точку входа и установитьпараметр через переменную окружения.

Один простой и легкий пример Dockerfile может быть:

FROM java:8
ENV NAME="John Dow"
ENTRYPOINT ["/bin/bash", "-c", "echo Hello, $NAME"]

с docker build . -t test и docker run -e NAME="test123" test

Также посмотрите на некоторыедополнительная документация: docker-run-vs-cmd-vs-entrypoint .

0 голосов
/ 21 декабря 2018

Если у вас получается изображение Docker, которое может выполнять несколько задач, немного необычно создавать одно изображение для каждой задачи так, как вы описываете.Вы можете передать дополнительные параметры командной строки в docker run или в большинстве других способов запуска контейнера, и вы можете использовать это для управления тем, что делает изображение.

Например, вы можете настроить изображениетак что вы можете запустить

docker run ... docker-p2p com.HelloWorld

, передав имя класса в качестве аргумента.Я написал бы сценарий точки входа, который обернул бы это в java вызов, если это уместно (но прошел через не-классовые имена, такие как docker run ... sh):

#!/bin/sh
set -e
case "$1" of
  com.*) exec java "$@" ;;
  *) exec "$@" ;;
esac

Соответствующий Dockerfile не принимает никакогоАРГУМЕНТЫ;это может быть

FROM java:8

# I prefer COPY to ADD, unless you explicitly want automatic
# HTTP fetches and/or tar file extraction.
COPY target/jar1.jar /p2p.jar
COPY ci/docker_entrypoint.sh /

# Globally set the class path.  (A Docker image only does one thing.)
ENV CLASSPATH /p2p.jar

# Always launch the entrypoint script.
ENTRYPOINT ["/docker_entrypoint.sh"]

# Give a default command, which with our script is a class name.
CMD ["com.HelloWorld"]

Если вам действительно нужен контейнер для задачи, вы можете создать базовое изображение, содержащее все, вплоть до строки ENTRYPOINT, а затем создать производные изображения FROM того базового изображения, котороепросто установите другой CMD.

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