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

时间:2019-01-30 19:05:09

标签: docker tty docker-run

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

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

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

1 个答案:

答案 0 :(得分:0)

我找到的最佳解决方案是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", "--"]

这基本上是从Tiny README上逐字记录的,并添加了-g,这使 Ctrl + C 的工作更像您期望的那样。 >

现在无需使用--tty,也无需涂抹stdoutstderr

它如何工作?

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