更新升级 专属应用 系统故障 硬件故障 电脑汽车 鸿蒙刷机 鸿蒙开发Linux教程 鸿蒙开发Linux命令
当前位置:HMXT之家 > 鸿蒙开发Linux教程 > 将Tini添加到容器及在Docker容器中使用Tini Init系统

将Tini添加到容器及在Docker容器中使用Tini Init系统

更新时间:2023-01-27 16:15:38浏览次数:461+次

本文提供了如何在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进程以及执行信号转发。