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
,