mvn jetty: разбитый внутри контейнера докера?

У меня есть приложение, которое использует цель " разбитый" на плагине Jetty Maven, которую мне нужно докеризировать. Происходит следующее: запускается maven, контейнер существует только около 10 секунд, а затем умирает, когда maven завершает работу после того, как он разветвляет дочерний процесс JVM.

Я исследовал много вариантов. Один вариант, который, как я думал, может сработать, состоит в том, чтобы установить для "waitForChild" значение true, а затем сделать что-то вроде этого:

ENTRYPOINT [ "/entrypoint.sh" ]
CMD [ "jetty:run-forked > /tmp/log 2>&1" ]

Но, хотя это продолжает работать Maven, образ не создается, потому что Docker ожидает SIGTERM.

Если вам интересно, почему мне нужно использовать jetty: run-forked, то это потому, что для кода требуется статически связанная библиотека, которая нуждается в JVM.

Я готов бросить полотенце, потому что это кажется невозможным...

1 ответ

Решение

Я не совсем уверен в вашей настройке Java, но хитрый трюк работает примерно так:

В ваш dockerfile добавьте собственный скрипт, например:

COPY myscript.sh /bin/myscript.sh # Remember to make this executable!

затем отредактируйте свою точку входа, чтобы отразить это:

ENTRYPOINT ["/bin/myscript.sh"]

Ваш myscript.sh может выглядеть примерно так:

#!/bin/bash

# Run Java/mvn commands here
...
jetty:run-forked > /tmp/log 2>&1

# Throw in a shell command that simply executes forever
tail -f /dev/null

Это будет гарантировать, что ваш контейнер продолжит работать даже после того, как ваш пристань / mvn порождает другой процесс и завершает работу, потому что это больше не PID 1 внутри контейнера, myscript.sh скрипт оболочки есть. Этот сценарий оболочки продолжает работать вечно из-за tail -f,

Другие вопросы по тегам