tini
是一个针对容器开发的、精简的 init
服务。tini
的作用是生成子进程、避免僵尸进程生成、转发信号量(pid
为 1
时)到子进程并等待它退出。使用 tini
可以优雅的结束容器内的进程。
背景
- Linux 中
pid
为 1
的 init
进程可以接受中断信号量,并将该信号量转发到所有子进程 - 非
init
需要程序实现转发信号的功能才能关闭其他程序,一般的 bash
、sh
不具备上述功能 - 使用
docker stop
时,容器内 pid
为 1
进程将接受中断信号量
Dockerfile
二进制使用
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", "--", "/docker-entrypoint.sh"]
apline
RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--", "/docker-entrypoint.sh"]
Debian
apt-get install tini
容器内进程
root 1 0 0 06:52 ? 00:00:00 /tini -- /docker-entrypoint.sh
debug
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd
扩展
tini 实现类似的工具