我有一堆在Docker容器中运行的脚本。它们由脚本调用,并不意味着是交互式的。外部脚本有时在终端中运行,有时不在终端中运行(如CI)。
我想支持用户使用 Ctrl + C 杀死脚本,因此我目前通过了-t
(--tty
)。但是我发现此选项结合了stdout
和stderr
。我不要。
有没有办法我可以支持 Ctrl + C 并且仍然拥有stderr
?
答案 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
,也无需涂抹stdout
和stderr
。
tini
的作者explaining it做得很好。但总而言之,泊坞窗将您的进程作为PID 1运行。PID 1通常是init,它有一些责任,例如处理信号。 bash
,以及您可能在容器中运行的大多数其他程序都不会执行这些操作。 tini
确实做到了,而且做得很好,他们将其添加为docker
到--init
中。该标志的唯一问题是它没有添加-g
,这对shell脚本很重要。因此,我建议将其手动添加到Dockerfile
中。