init Tini是您可以想到的最简单的init 。
Tini所做的就是产生一个孩子(Tini打算在容器中运行),并等待它在收集僵尸并执行信号转发的同时退出。
使用Tini有几个好处:
SIGTERM可以正确终止您的过程,即使您没有明确安装信号处理程序。如果您想更多有关为什么有用的详细信息,请查看此问题讨论:Tini的优势是什么?
注意:如果您使用的是Docker 1.13或更高的时间,则Tini本身包含在Docker本身中。这包括所有版本的Docker CE。要启用tini,只需将--init标志传递到docker run即可。
注意:有可用于Tini的预制码头图像。如果您当前使用Ubuntu或CentOS图像作为基础,则可以将其中一个用作置换式替代品。
注意:有用于高山Linux和Nixos的Tini软件包。有关安装说明,请参见下文。
将Tini添加到您的容器中,并使其可执行。然后,只需调用Tini,然后将您的程序及其论点作为论点传递给Tini。
在Docker中,您将需要使用入门点,因此您不必记住手动调用Tini:
# Add Tini
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]
# Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]
# or docker run your-image /your/program ...
请注意,您可以跳过--在某些条件下,但您也可以始终将其包含在安全的情况下。如果您看到一条看起来像tini: invalid option -- 'c' ,则需要添加-- 。
在下面的示例中,应像-v一样传递Tini本身的论点: /tini -v -- /your/program 。
注意:上面链接的二进制是一个64位动态链接的二进制。
使用密钥595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7签署tini和tini-static二进制文件。
您可以使用gpg验证其签名(您可以使用软件包管理器安装):
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini.asc /tini.asc
RUN gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7
&& gpg --batch --verify /tini.asc /tini
RUN chmod +x /tini
tini和tini-static二进制文件产生了校验和SHA1和SHA256 。
您可以使用sha1sum和sha256sum验证他们的校验和(您可以使用软件包管理器安装):
ENV TINI_VERSION v0.19.0
RUN wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64
&& wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64.sha256sum
&& echo "$(cat tini-amd64.sha256sum)" | sha256sum -c
在Alpine Linux上,您可以使用以下命令安装Tini:
RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
使用NIX,您可以使用以下命令安装Tini:
nix-env --install tini
在Debian(Buster或更新)上,您可以使用以下命令安装Tini:
apt-get install tini
请注意,此安装/usr/bin/tini (和/usr/bin/tini-static ),而不是/tini 。
在Arch Linux上,AUR上有一个包装。使用官方说明安装或使用AUR助手:
pacaur -S tini
提供手臂和32位二进制文件!您可以在“版本”选项卡下找到可用的二进制文件的完整列表。
-v参数可用于额外的详细输出(您最多可以将其传递3次,例如-vvv )。
默认情况下,Tini需要以PID 1的速度运行,以便它可以收获僵尸(通过以PID 1运行,僵尸将重新分配给Tini)。
如果出于某种原因,您不能以PID 1的形式运行Tini,则应通过以下方式注册Tini作为一个过程(仅在Linux> = 3.4)中。
-s论点传递给蒂尼( tini -s -- ... )TINI_SUBREAPER (例如export TINI_SUBREAPER= )。这将确保尽管蒂尼(Tini)并未以PID 1的速度运行,但僵尸将重新分配给Tini。
注意:如果Tini检测到它没有以PID 1的形式运行并且未注册为子育,则将发出警告。如果您看不到警告,那就很好。
Tini在退出时会重复使用孩子的退出代码,但偶尔,这可能不是您想要的(例如,如果您的孩子在收到Sigterm后143次退出)。值得注意的是,这可能是Java应用程序的问题。
在这种情况下,您可以使用-e标志将任意退出代码重新映射到0。如果需要,可以多次传递标志。
例如:
tini -e 143 -- ...
默认情况下,Tini仅杀死其直接的儿童进程。如果向该过程发送信号没有所需的效果,这可能是不便的。例如,如果您这样做
docker run krallin/ubuntu-tini sh -c 'sleep 10'
和Ctrl-c,什么也没有发生:Sigint被发送到“ SH”过程,但是当它在等待“睡眠”完成时,该外壳不会对其做出反应。
使用-g选项,Tini杀死了儿童过程组,因此组中的每个过程都会获得信号。这更接近地对应于您在终端中进行CTRL-C等时发生的情况:信号发送到前景过程组。
Tini可以设置其母体死亡信号,这是Tini的父母退出时应收到的信号。要设置父人死亡信号,请使用带有信号tini的名称的-p标志在其父母退出时应收到的信号:
tini -p SIGTERM -- ...
注意:请参阅此公关讨论,以了解有关父母死亡信号和用例的更多信息。
Tini也可以与容器中的现有入口点一起使用!
假设您的入口点是/docker-entrypoint.sh ,那么您将使用:
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"]
Tini的依赖项很少(仅取决于LIBC),但是如果您的容器无法启动,则可能需要考虑使用静态构建版本:
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini
Tini是一个很小的文件(在10KB范围内),因此它不会为您的容器增加太大的重量。
静态链接的版本更大,但仍然<1m。
如果您不想下载二进制文件,则可以通过运行cmake . && make 。
在构建之前,您可能还想运行:
export CFLAGS="-DPR_SET_CHILD_SUBREAPER=36 -DPR_GET_CHILD_SUBREAPER=37"
这样一来,即使您是在具有旧Linux内核标头的系统上构建的(<3.4),Tini也会以儿童亚品为支持。如果您要与Docker一起使用Tini,这通常是您想要的(如果您的主机内核支持Docker,它也应支持子族子派生)。
产卵后,Tini将等待信号并将这些信号转发到子过程中,并定期收获可能在您的容器中创建的僵尸过程。
当“第一个”子进程退出(上面的示例中的/your/program )时,Tini也会退出,并在子进程的退出代码(因此,您可以检查容器的退出代码以了解孩子是否成功地退出)。
如果某件事不像您期望的那样工作,请考虑提高详细水平(最多3):
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd
维护者:
贡献者:
特别感谢: