在扭曲脚本上终止 SIGTERM 上的 docker 容器

Terminating docker container on SIGTERM on warping script

我有以下 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 函数被调用并且容器被移除。然后我的进程退出。

但是,当我运行在后台进行warping进程,即my_warping_script_above.py &,然后kill同样,catch_term 函数根本没有被调用,我的脚本保持 运行ning,包括容器。

自己回答:

这个技巧解决了我的问题:将 preexec_fn=os.setsid 添加到 subprocess.Popen 函数:

p = subprocess.Popen(cmd, preexec_fn=os.setsid)