0

我有一堆在 docker 容器中运行的脚本。它们由脚本调用,并不意味着是交互式的。外部脚本有时在终端中运行,有时则不在(如 CI 中)。

我想支持用户使用Ctrl+杀死脚本C,所以我目前通过-t( --tty)。但我发现这个选项结合了stdoutstderr。我不想要那个。

有没有办法我可以支持Ctrl+C并且仍然有stderr

4

1 回答 1

1

我找到的最好的解决方案是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,也不需要使用stdoutand stderr

它是如何工作的?

tini的作者很好地解释了它。但总而言之,docker 将您的进程作为 PID 1 运行。PID 1 通常是 init,它有一些职责,比如处理信号。bash,以及您可能在容器中运行的大多数其他程序,不要做这些事情。tini确实如此,而且做得很好,他们将其添加到dockeras --init. 该标志的唯一问题是它没有添加-g,这对于 shell 脚本很重要。所以我建议将它添加到Dockerfile手动。

于 2019-02-22T22:35:32.547 回答