Как я могу использовать синтаксис bash-only в CMD в Dockerfile? - PullRequest
0 голосов
/ 02 декабря 2018

Я создаю Dockerfile, который запускает приложение Java.Это приложение Java получает путь к файлу, который содержит вывод ls -l.

(Обратите внимание, что в моем реальном Dockerfile я не выполняю ls - l, а довольно сложные команды. Я изменил это на ls - l, чтобы упростить вопрос.)

Я попробовал следующее:

FROM openjdk:8-jre

ARG JAR
COPY target/$JAR /app/app.jar

CMD java -jar /app/app.jar <( ls -l )

Эта конструкция bash <( ... ) должна создать временный файл, содержащий выходные данные ls -l.

При запуске файла Docker я получаю:

/bin/sh: 1: Syntax error: "(" unexpected

Теперь sh не поддерживает конструкцию <( ... ), следовательно, ошибка.Как можно безопасно запустить приложение с помощью bash вместо sh?С безопасностью я имею в виду, что приложение Java по-прежнему будет получать все сигналы ОС (SIGHUP, ...) и реагировать соответствующим образом.

Ответы [ 2 ]

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

Если вы делаете сложные вещи при запуске, часто проще записать их в скрипт, чем пытаться создать очень сложную командную строку.Выполнив это, вы можете использовать набор примитивов, доступных в стандарте оболочки POSIX , даже если им требуется несколько команд для выполнения действий, которые GNU bash может делать встраиваемыми.

Для этого я мог бы написать скрипт:

#!/bin/sh
ls -l >/ls-l.txt
exec java -jar /app/app.jar /ls-l.txt

, а затем скопировать его как элемент по умолчанию, который запускает ваше изображение

FROM openjdk:8-jre
ARG JAR
COPY target/$JAR /app/app.jar
COPY launch-app.sh /usr/bin/app
# RUN chmod +x /usr/bin/app, if it's not already executable
CMD ["app"]
0 голосов
/ 02 декабря 2018

Замените вашу команду списком JSON, для которого первыми двумя элементами являются bash -c, а последним элементом является команда оболочки, которую вы фактически хотите выполнить.

CMD ["bash", "-c", "exec java -jar /app/app.jar <( ls -l )"]

Для генерациитакой массив для более сложной команды, вы можете рассмотреть возможность использования jq для обеспечения правильности синтаксиса, даже для ввода с обратными слешами, переводами строки или кавычками:

jq -cnRs '["bash", "-c", input]' <<'EOF'
# you can put other shell commands here if you need to
exec java -jar /app/app.jar <( ls -l )
EOF

exec гарантирует, что java экземпляр заменяет bash и, таким образом, посылает сигналы напрямую.

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