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签署tini和tini -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
通过校验和验证二进制
tini和tini -static二进制文件产生了校验和( SHA1和SHA256 )。
您可以使用sha1sum和sha256sum验证他们的校验和(您可以使用软件包管理器安装):
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
