Как сделать так, чтобы процесс, запущенный точкой входа Docker, мог быть уничтожен? - PullRequest
0 голосов
/ 12 апреля 2019

Я создаю образ Docker, который запускает длительный процесс Java. Я хочу убедиться, что он может быть уничтожен вместе с контейнером (например, с помощью Ctrl + C), но все же выполнить очистку.

Если я использую exec java -jar в моей точке входа, она работает как положено. Если я просто выполняю java -jar, процесс не может быть остановлен.

Однако exec завершает работу контейнера даже в случае успеха, и это проблема, если эта команда не является последней в точке входа. Например, если после преобразования или очистки файла не будет выполнено:

exec java -jar "./lib/Saxon-HE-${SAXON_VER}.jar" -s:"$json_xml" -xsl:"$STYLESHEET" base-uri="$base"
rm "$json_xml"

Я думаю, что объяснение состоит в том, что при использовании exec процесс (java в этом случае) становится PID = 1 и получает сигналы уничтожения, в то время как без exec он получает какой-то другой PID и не получает сигналы и поэтому не может быть убит.

Итак, мой вопрос двоякий:

  • существует ли обходной путь, позволяющий завершить процесс, не выходя из контейнера в случае успеха, как exec делает?
  • как мне убедиться, что очистка после exec (rm в этом случае) будет выполнена, даже если процесс будет завершен / завершен?

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Я использую тини. Вот ссылка ссылка

1 голос
/ 12 апреля 2019

Вы можете просто создать другую программу, которая будет управлять дочерним процессом java и очисткой, например, используя те же java, go или rust для написания таких файлов.Я уверен, что эти языки имеют надлежащие инструменты управления процессами, и вы можете перехватывать CTRL-C и другие события, чтобы остановить внутренний дочерний процесс и выполнить очистку.Возможно, это займет даже меньше времени по сравнению с поиском инструментов, которые в любом случае будут иметь ограниченное поведение.Также может быть даже стоит открыть его для таких проблем.

1 голос
/ 12 апреля 2019

Вы можете создать сценарий bash для точки входа, который перехватывает сигнал CTRL-C, убивает (или изящно останавливает?) Процесс Java и впоследствии выполняет очистку.

Пример (не тестировался):

#!/bin/bash

# trap ctrl-c and call ctrl_c()
trap ctrl_c INT

function ctrl_c() {
        echo "Trapped CTRL-C"
        # Do something here. Kill Java?
}

java -jar "./lib/Saxon-HE-${SAXON_VER}.jar" -s:"$json_xml" -xsl:"$STYLESHEET" base-uri="$base"

Добавьте его в свой образ докера и сделайте его точкой входа

FROM java:8

ADD docker-entrypoint.sh /docker-entrypoint.sh

ENTRYPOINT ["/docker-entrypoint.sh"]
...