使用 tini 优雅的关闭 Docker 进程
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.shdebug
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd扩展
tini 实现类似的工具
- k8s 中 Pause Pod
- dumb-init python 实现
- s6-overlay
- runit
- MONIT