У меня есть следующий скрипт 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
, но моя функция не вызывается, когда скрипт работает в фоновом режиме ... (Я думаю, что он пытается сначала убить дочерний процесс, а затем, когда он завершается неудачно , не доходит до стадии вызова моей зарегистрированной функции).