当CTRL + C-ing docker组成时,如何从服务打印到终端(对SIGINT / SIGTERM作出反应)?

问题描述 投票:0回答:1

我有一个服务(在那个例子中是python)在SIGINT / SIGTERM上打印一些东西。

printer.py

import signal
import sys
import threading

def runner(stop_event):
    while not stop_event.wait(1):
        print('Hi.', flush=True)

stop_event = threading.Event()

def signal_handler(*_):
    stop_event.set()
    print('Bye.', flush=True)
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)

runner_thread = threading.Thread(target=runner, args=(stop_event,))
runner_thread.start()
runner_thread.join()

当在终端中正常运行并按CTRL + C时,它工作正常,即打印Bye.消息:

$ python3 printer.py 
Hi.
Hi.
^CBye.

但是当使用Docker compose和CTRL + C-ing运行时,Bye.永远不会显示。

Dockerfile

FROM python:3.7
ADD printer.py .
CMD [ "python", "printer.py" ]

docker-compose.yml

version: '2.4'

services:
  printer:
    build:
      context: .
      dockerfile: Dockerfile

终端互动:

$ docker-compose up
Creating network "compose_print_term_default" with the default driver
Creating compose_print_term_printer_1 ... done
Attaching to compose_print_term_printer_1
printer_1  | Hi.
printer_1  | Hi.
^CGracefully stopping... (press Ctrl+C again to force)
Stopping compose_print_term_printer_1 ... done

可以做些什么来使Bye.可见?

python docker docker-compose sigint sigterm
1个回答
0
投票

似乎是docker compose的一个问题,已经有几年了:https://github.com/docker/compose/issues/592

© www.soinside.com 2019 - 2024. All rights reserved.