我有一堆在 docker 容器中运行的脚本。它们由脚本调用,并不意味着是交互式的。外部脚本有时在终端中运行,有时则不在(如 CI 中)。
我想支持用户使用Ctrl+杀死脚本C,所以我目前通过-t
( --tty
)。但我发现这个选项结合了stdout
和stderr
。我不想要那个。
有没有办法我可以支持Ctrl+C并且仍然有stderr
?
我有一堆在 docker 容器中运行的脚本。它们由脚本调用,并不意味着是交互式的。外部脚本有时在终端中运行,有时则不在(如 CI 中)。
我想支持用户使用Ctrl+杀死脚本C,所以我目前通过-t
( --tty
)。但我发现这个选项结合了stdout
和stderr
。我不想要那个。
有没有办法我可以支持Ctrl+C并且仍然有stderr
?
我找到的最好的解决方案是tini。具体来说,将以下内容添加到Dockerfile
:
ENV TINI_VERSION v0.18.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "-g", "--"]
这主要是从 tini README 中逐字提取的,并添加了-g
,这使得Ctrl+的C工作更像你所期望的。
现在不需要使用--tty
,也不需要使用stdout
and stderr
。
tini
的作者很好地解释了它。但总而言之,docker 将您的进程作为 PID 1 运行。PID 1 通常是 init,它有一些职责,比如处理信号。bash
,以及您可能在容器中运行的大多数其他程序,不要做这些事情。tini
确实如此,而且做得很好,他们将其添加到docker
as --init
. 该标志的唯一问题是它没有添加-g
,这对于 shell 脚本很重要。所以我建议将它添加到Dockerfile
手动。