Завершение Docker-контейнера на SIGTERM по сценарию деформации - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующий скрипт Python, который деформирует запуск контейнера Docker:

import subprocess
import sys
import signal

container_id = None

def catch_term(signum, frame):
    sys.stderr.write('Caught SIGTERM. Stopping container\n')
    if container_id != None:
        cmd = ['docker', 'rm', '-f', container_id]
        subprocess.call(cmd)
    sys.exit(143)

signal.signal(signal.SIGTERM, catch_term)
cmd = ['docker', 'run', '--cidfile', cidfile, '-i', image_name, container_process_cmd]
p = subprocess.Popen(cmd)
# This function waits for the file to contain 64 bytes and then reads the container id from it
container_id = get_container_id_from_cidfile(cidfile)
p.communicate()
sys.exit(p.returncode)

Когда я запускаю процесс Python в интерактивном режиме и убиваю этот сценарий деформации во время выполнения (kill <PID>), вызывается функция catch_term и контейнер удаляется. Тогда мой процесс завершается.

Однако , когда я запускаю процесс деформации на фоне, то есть my_warping_script_above.py &, и уничтожаю его таким же образом, функция catch_term вообще не вызывается и мой скрипт продолжает работать, включая контейнер.

  • Есть идеи, как заставить функцию catch_term вызываться, даже если скрипт работает в фоновом режиме?

  • Я думаю, это как-то связано с тем фактом, что docker run является «защищенным» процессом. Он может быть убит только командой docker, такой как docker rm -f <CONTAINER ID> или Ctrl+C, если вызывается с -i. Вот почему я пытаюсь поймать сигнал TERM и вызвать docker rm, но моя функция не вызывается, когда скрипт работает в фоновом режиме ... (Я думаю, что он пытается сначала убить дочерний процесс, а затем, когда он завершается неудачно , не доходит до стадии вызова моей зарегистрированной функции).

1 Ответ

0 голосов
/ 07 ноября 2018

Отвечая себе:

Этот трюк решил мою проблему: добавив preexec_fn=os.setsid к функции subprocess.Popen:

p = subprocess.Popen(cmd, preexec_fn=os.setsid)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...