如何 docker 运行,支持 Ctrl+C,不结合 stderr
how to docker run, support Ctrl+C, and not combine 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
和 stderr
。
它是如何工作的?
tini
的作者做得很好explaining it。但总而言之,docker 运行 你的进程是 PID 1。PID 1 通常是 init,它有一些职责,比如处理信号。 bash
,以及您可能 运行 在容器中的大多数其他程序,不要做这些事情。 tini
做到了,而且做得很好,他们将它添加到 docker
中作为 --init
。该标志的唯一问题是它不添加 -g
,这对 shell 脚本很重要。所以我建议手动将它添加到 Dockerfile
。
我 运行 在 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
和 stderr
。
它是如何工作的?
tini
的作者做得很好explaining it。但总而言之,docker 运行 你的进程是 PID 1。PID 1 通常是 init,它有一些职责,比如处理信号。 bash
,以及您可能 运行 在容器中的大多数其他程序,不要做这些事情。 tini
做到了,而且做得很好,他们将它添加到 docker
中作为 --init
。该标志的唯一问题是它不添加 -g
,这对 shell 脚本很重要。所以我建议手动将它添加到 Dockerfile
。