如何 docker 运行,支持 Ctrl+C,不结合 stderr

how to docker run, support Ctrl+C, and not combine stderr

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

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

有什么方法可以支持 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,也不需要混淆 stdoutstderr

它是如何工作的?

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