tini

C/C++ 2025-08-12

tini容器的微小但有效的init

tini是您可以想到的最简单的init

tini所做的就是产生一个孩子( tini打算在容器中运行),并等待它在收集僵尸并执行信号转发的同时退出。

为什么tini ?

使用tini有几个好处:

  • 它可以保护您免受意外创建僵尸过程的软件,该软件可以(随着时间的流逝!)饿死您的整个系统(并使其无法使用)。
  • 它确保默认信号处理程序可用于您在Docker映像中运行的软件。例如,使用tini , SIGTERM可以正确终止您的过程,即使您没有明确安装信号处理程序。
  • 它确实如此透明!无tini起作用的Docker图像将与tini合作而不会进行任何更改。

如果您想了解有关为什么有用的更多详细信息,请查看此问题讨论: tini的优势是什么?

使用tini

注意:如果您使用的是Docker 1.13或更高的时间, tini本身包含在Docker本身中。这包括所有版本的Docker CE。要启用tini ,只需将--init标志传递到docker run即可。

注意:有可用于tini预制码头图像。如果您当前使用Ubuntu或CentOS图像作为基础,则可以将其中一个用作置换式替代品。

注意:有用于高山Linux和Nixos的tini软件包。有关安装说明,请参见下文。

将tini添加到您的容器中,并使其可执行。然后,只需调用tini ,然后将您的程序及其论点作为论点传递给tini 。

在Docker中,您将需要使用入门点,因此您不必记住手动调用tini :

tini ENV tini _VERSION=v0.19.0 ADD https://*github.co**m/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 ...">
 # Add tini
ENV tini _VERSION=v0.19.0
ADD https://*github.co**m/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签署tinitini -static二进制文件。

您可以使用gpg验证其签名(您可以使用软件包管理器安装):

tini_VERSION v0.19.0 ADD https://*github.co**m/krallin/tini/releases/download/${ tini _VERSION}/ tini / tini ADD https://*github.co**m/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 ">
 ENV tini _VERSION v0.19.0
ADD https://*github.co**m/krallin/tini/releases/download/${ tini _VERSION}/ tini / tini
ADD https://*github.co**m/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

通过校验和验证二进制

tinitini -static二进制文件产生了校验和( SHA1SHA256 )。

您可以使用sha1sumsha256sum验证他们的校验和(您可以使用软件包管理器安装):

tini_VERSION v0.19.0 RUN wget --no-check-certificate --no-cookies --quiet https://*github.co**m/krallin/tini/releases/download/${ tini _VERSION}/ tini -amd64 && wget --no-check-certificate --no-cookies --quiet https://*github.co**m/krallin/tini/releases/download/${ tini _VERSION}/ tini -amd64.sha256sum && echo "$(cat tini -amd64.sha256sum)" | sha256sum -c">
 ENV tini _VERSION v0.19.0
RUN wget --no-check-certificate --no-cookies --quiet https://*github.co**m/krallin/tini/releases/download/${ tini _VERSION}/ tini -amd64 
    && wget --no-check-certificate --no-cookies --quiet https://*github.co**m/krallin/tini/releases/download/${ tini _VERSION}/ tini -amd64.sha256sum 
    && echo "$(cat tini -amd64.sha256sum)" | sha256sum -c

高山Linux软件包

在Alpine Linux上,您可以使用以下命令安装tini :

tini # tini is now available at /sbin/ tini ENTRYPOINT ["/sbin/ tini ", "--"]">
 RUN apk add --no-cache tini
# tini is now available at /sbin/ tini
ENTRYPOINT ["/sbin/ tini ", "--"]

尼克斯

使用NIX,您可以使用以下命令安装tini :

 nix-env --install tini

Debian

在Debian(Buster或更新)上,您可以使用以下命令安装tini :

 apt-get install tini

请注意,此安装/usr/bin/ tini (和/usr/bin/ tini -static ),而不是/ tini

Arch Linux

在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 ( 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 --rm krallin/ubuntu- tini sh -c 'sleep 10'

和Ctrl-c,什么也没有发生:Sigint被发送到“ SH”过程,但是当它在等待“睡眠”完成时,该外壳不会对其做出反应。

您可以配置tini以杀死子进程组,以便组中的每个过程都通过以下任一。

  • -g论点传递给tini ( tini -g -- ...
  • 设置环境变量tini _KILL_PROCESS_GROUP (例如export tini _KILL_PROCESS_GROUP= )。

这更接近地对应于您在终端中进行CTRL-C等时发生的情况:信号发送到前景过程组。

tini -g -- sh -c 'sleep 10'">
 docker run --rm --entrypoint tini krallin/ubuntu- tini -g -- sh -c 'sleep 10'

父母死亡信号

tini可以设置其母体死亡信号,这是tini父母退出时应收到的信号。要设置父人死亡信号,请使用带有信号tini的名称的-p标志在其父母退出时应收到的信号:

 tini -p SIGTERM -- ...

注意:请参阅此公关讨论,以了解有关父母死亡信号和用例的更多信息。

更多的

现有的入口点

tini也可以与容器中的现有入口点一起使用!

假设您的入口点是/docker-entrypoint.sh ,那么您将使用:

 ENTRYPOINT ["/ tini ", "--", "/docker-entrypoint.sh"]

静态链接版本

tini的依赖项很少(仅取决于LIBC),但是如果您的容器无法启动,则可能需要考虑使用静态构建版本:

tini -static / tini ">
 ADD https://*github.co**m/krallin/tini/releases/download/${ tini _VERSION}/ tini -static / tini

尺寸注意事项

tini是一个很小的文件(在10KB范围内),因此它不会为您的容器增加太大的重量。

静态链接的版本更大,但仍然<1m。

建造tini

如果您不想下载二进制文件,则可以通过运行cmake . && make来构建tini 。 cmake . && make

在构建之前,您可能还想运行:

 export CFLAGS="-DPR_SET_CHILD_SUBREAPER=36 -DPR_GET_CHILD_SUBREAPER=37"

这样一来,即使您是在具有旧Linux内核标头的系统上构建的(<3.4), tini也会以儿童亚品为支持。如果您要与Docker一起使用tini ,这通常是您想要的(如果您的主机内核支持Docker,它也应支持子族子派生)。

了解tini

产卵后, tini将等待信号并将这些信号转发到子过程中,并定期收获可能在您的容器中创建的僵尸过程。

当“第一个”子进程退出(上面的示例中的/your/program )时, tini也会退出,并在子进程的退出代码(因此,您可以检查容器的退出代码以了解孩子是否成功地退出)。

调试

如果某件事不像您期望的那样工作,请考虑提高详细水平(最多3):

tini -v -- bash -c 'exit 1' tini -vv -- true tini -vvv -- pwd">
 tini -v    -- bash -c 'exit 1'
tini -vv   -- true
tini -vvv  -- pwd

作者

维护者:

  • 托马斯·奥罗斯科(Thomas Orozco)

贡献者:

  • 蒂安·格拉维(Tianon Gravi)
  • 大卫·瓦格(David Wragg)
  • 迈克尔·克罗斯比
  • 怀亚特·普尔(Wyatt Preul)
  • 帕特里克·斯坦哈特

特别感谢:

  • DaniloBürger为Alpine包装tini
  • Asko Soukka用于包装tini的Nix
  • 用于拱门Linux包装tini的nfnty
下载源码

通过命令行克隆项目:

git clone https://github.com/krallin/tini.git