Skip to content

Tini是一个最小化到 init 系统,运行在容器内部,用于启动一个子进程,并等待进程退出时清理僵尸和执行信号转发。 这是一个替代庞大复杂的systemd体系的解决方案,已经集成到Docker 1.13中,并包含在Docker CE的所有版本

Tini的优点:

  • 可以避免应用程序生成僵尸进程
  • 可以处理Docker进程中运行的程序的信号,例如,通过Tini, SIGTERM 可以终止进程,不需要你明确安装一个信号处理器

要激活Tini,在 docker run 命令中传递 --init 参数就可以

 docker run --init -it centos bash
 docker run --init -it centos bash

使用Tini可以让Docker容器更优雅的退出. 正常情况下, 当Docker容器退出时, 容器内的1号进程将会收到SIGTERM信号来优雅的退出, 但当容器内还有其他子进程时, 其他的子进程收到的信号是SIGKILL, 而不是SIGTERM. 这就导致了哪怕子进程中对SIGTERM信号进行了捕获处理, 最终也不会收到该信号. 而收到了强制杀死(kill -9)的信号

很早之前的版本通过以下方式

bash
# 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 ["/usr/local/bin/tini", "--", "/docker-entrypoint.sh"]
# 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 ["/usr/local/bin/tini", "--", "/docker-entrypoint.sh"]