Назад | Перейти на главную страницу

Процесс внутри контейнера докеров не получает сигналов?

У меня есть процесс в контейнере докеров, который должен регистрировать дамп потока (на stdout) при завершении работы. Однако когда docker stop вызывается на нем, вывода не происходит.

Кажется, что либо процесс не получает сигнал TERM, либо выход отключается до завершения завершения работы.

Я использую только CMD (нет ENTRYPOINT) в моем Dockerfile:

CMD java ${MY_JAVA_OPTS} my-uberjar.jar

Как мне получить вывод при выключении?

Точка входа контейнера докеров - это оболочка, вызывающая этот 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 как указано выше.