将Tini添加到容器及在Docker容器中使用Tini Init系统
本文提供了如何在Linux操作系统平台Docker Containers中使用Tini Init系统的必要知识。介绍将Tini添加到容器及如何在Docker容器中使用Tini Init系统的方法。
将Tini添加到容器中
Tini存在于Docker 1.13及更高版本中。在运行docker容器时,可以使用--init标志轻松启用它。
1、使用预先构建的Tini图像
还有Tini for Ubuntu和CentOS基座的预构建图像,也可以作为您基座的替代品。您所做的就是修改Dockerfile以使用Tini图像。
例如:
# Change this:
FROM ubuntu:trusty
# To this:
FROM krallin/ubuntu-tini:trusty
使用此图像,发送的ENTRYPOINT应指向Tini。如果您已经配置了ENTRYPOINT,请按如下方式进行修改:
# Change this:
ENTRYPOINT ["/docker-entrypoint.sh"]
# To this:
ENTRYPOINT ["/usr/local/bin/tini", "--", "/docker-entrypoint.sh"]
记住,如果您没有使用ENTRYPOINT,请不要进行上述更改。
2、使用Tini软件包
有适用于Alpine Linux和NixOS的Tini软件包,可以添加到Docker文件中,如下所示。
1]、Alpine Linux软件包
RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
2]、NixOS包
nix-env --install tini
3、手动添加Tini
您还可以将Tini添加到容器中并使其可执行。继续并调用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添加到上面的容器时使用已签名的二进制文件:
# Add Tini
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
ENTRYPOINT ["/tini", "--"]
# Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]
# or docker run your-image /your/program ...
要使用上述命令,请确保从包管理器安装了gpg。
如何在Docker容器中使用Tini Init系统
在这里,我将通过使用--init标志来演示如何从Docker本身使用Tini。
不传递init标志的容器运行会将CMD设置为PID 1。在本例中,CMD是/bin/bash:
$ docker run -ti --rm ubuntu:20.04 /bin/bash
Unable to find image 'ubuntu:20.04' locally
20.04: Pulling from library/ubuntu
d5fd17ec1767: Pull complete
Digest: sha256:47f14534bda344d9fe6ffd6effb95eefe579f4be0d508b7445cf77f61a0e5724
Status: Downloaded newer image for ubuntu:20.04
root@bcb9f64af7fc:/#
检查PID:
root@bcb9f64af7fc:/# ps -fA
上面的输出显示CMD为PID 1。现在让我们看看当调用--init标志时会发生什么:
$ docker run -ti --init --rm ubuntu:20.04 /bin/bash
当使用Tini init时,它变为PID 1,如上所示。现在,PID 1的Tini将正确收获分叉子进程。
另一个使用预构建Tini图像的示例:
$ docker run -ti krallin/ubuntu-tini:trusty /bin/bash
您也可以使用Tini对正在运行的容器执行这些命令,如下所示。
检查PID:
docker exec -it <container_name> ps -fA
例如:
检查Tini版本:
$ docker exec -it semaphore tini --version
tini version 0.19.0
1、Subreaping
为了让Tini收获zombies,它应该按照PID 1运行。这确保了zombies是Tini的re-parented。如果Tini无法作为PID 1运行,则需要将Tini注册为流程子报表。这可以通过两种方式实现:
将-s参数传递给Tini(tini -s -- …)。
调用变量TINI_SUBREAPER,例如导出export TINI_SUBREAPER=。
2、重新映射出口代码
Tini在退出时重复使用子进程的退出代码。这可能不是你喜欢的。例如,如果子进程在收到SIGTERM后以143退出,则此问题在Java应用程序中很明显。可以使用-e标志将代码重新映射到0:
tini -e 143 -- ...
使用Tini时有几个选项,请获得以下帮助:
root@928f92c6a1b1:/# tini -h
tini (tini version 0.19.0 - git.fec3683)
Usage: tini [OPTIONS] PROGRAM -- [ARGS] | --version
Execute a program under the supervision of a valid init process (tini)
Command line options:
--version: Show version and exit.
-h: Show this help message and exit.
-s: Register as a process subreaper (requires Linux >= 3.4).
-p SIGNAL: Trigger SIGNAL when parent dies, e.g. "-p SIGKILL".
-v: Generate more verbose output. Repeat up to 3 times.
-w: Print a warning when processes are getting reaped.
-g: Send signals to the child's process group.
-e EXIT_CODE: Remap EXIT_CODE (from 0 to 255) to 0.
-l: Show license and exit.
Environment variables:
TINI_SUBREAPER: Register as a process subreaper (requires Linux >= 3.4).
TINI_VERBOSITY: Set the verbosity level (default: 1).
TINI_KILL_PROCESS_GROUP: Send signals to the child's process group.
结论
通过以上操作,标志着本文关于如何在Docker Containers中使用Tini Init系统的结束。现在,您可以使用Tini获取zombie进程以及执行信号转发。