Docker exe c команда в сценарии точки входа не выполнена - PullRequest
0 голосов
/ 10 января 2020

Следуя предложению на Выполнить сценарий до CMD (мне нужно было очистить временный каталог перед повторным запуском контейнера, чтобы исправить ошибку), я изменил свой файл docker от использования CMD для точки входа следующим образом:

ENTRYPOINT ["/app/entrypoint.sh", "/usr/bin/java -Dlog4j.configurationFile=/app/resources/LINUX/${LOG4J_FILE} -Dpa.config=/app/resources/LINUX/${CONFIG_FILE} -jar /app/app.jar"]

и в конце файла точки входа после команды rm -rf:

exec "$@"

Но docker не может запустить контейнер, он выходит, журнал контейнера показывает:

+ exec '/usr/bin/java -Dlog4j.configurationFile=/app/resources/LINUX/${LOG4J_FILE} -Dpa.config=/app/resources/LINUX/${CONFIG_FILE} -jar /app/app.jar' /app/entrypoint.sh: line 7: /usr/bin/java -Dlog4j.configurationFile=/app/resources/LINUX/${LOG4J_FILE} -Dpa.config=/app/resources/LINUX/${CONFIG_FILE} -jar /app/app.jar: No such file or directory - что это значит? что не так?

1 Ответ

1 голос
/ 10 января 2020

Вам нужно разбить командную строку JSON -array-format на отдельные слова. Поскольку вы явно указали Docker, что «командная» часть этого представляет собой одно слово, он ищет двоичный файл в /usr/bin с именем java -Dlog4j.configurationFile=..., с пробелами и параметрами и всеми как частью имени файла, и не найти его.

Как правило, вы не хотите вставлять команду, которую хотите запустить в ENTRYPOINT, особенно если вы используете этот макет оболочки. Сделайте ENTRYPOINT просто именем скрипта, оканчивающимся на exec "$@"; он должен использовать синтаксис JSON -array. Сделайте CMD фактической командой, которую вы хотите выполнить, в любом удобном синтаксисе. (Если вы пытаетесь расширить переменные окружения, синтаксис, ориентированный на оболочку, мог бы быть лучше.)

ENTRYPOINT ["/app/entrypoint.sh"]
CMD /usr/bin/java \
  -Dlog4j.configurationFile=/app/resources/LINUX/${LOG4J_FILE} \
  -Dpa.config=/app/resources/LINUX/${CONFIG_FILE} \
  -jar /app/app.jar

Я нашел этот шаблон достаточно распространенным и полезным, который я обычно рекомендовал бы использовать ENTRYPOINT только для этого вида скрипта-обёртки; предпочитайте указывать команду для запуска приложения под именем CMD, даже если у вас нет оболочки входа.

...