Процесс внутри док-контейнера не получает сигналы?
У меня есть процесс в контейнере Docker, который должен записывать дамп потока (на стандартный вывод) при завершении работы. Однако когда docker stop
на него вызывается, выход не происходит.
Кажется, что либо процесс не получает сигнал TERM, либо выход отключен до завершения выключения.
Я использую только CMD
(нет ENTRYPOINT
) в моем Dockerfile:
CMD java ${MY_JAVA_OPTS} my-uberjar.jar
Как мне получить выход при выключении?
1 ответ
Точка входа в Docker-контейнер представляет собой оболочку, вызывающую этот CMD, поскольку она находится в форме оболочки.
Однако эта форма вызова не распространяет сигналы.
Вам нужно вызвать процесс, используя exec
, что можно сделать с помощью формы exec:
CMD ["java", "-Doption=value", "my-uberjar.jar"]
или с помощью exec
в явном виде:
CMD exec java ${MY_JAVA_OPTS} my-uberjar.jar
Это приводит к тому, что оболочка заменяет собой запущенный процесс, который затем получает сигналы.
Форма exec, однако, не выполняет расширение оболочки (потому что оболочки нет), поэтому, если вам это нужно, вам придется обернуть вызов оболочки и exec
снова:
CMD ["/bin/sh", "-c", "exec", "java", "${MY_JAVA_OPTS}", ...
или используйте форму оболочки с exec
как указано выше.