docker run --init 到底往容器里放了什么?它是镜像的一部分吗,占多少内存,退出码和信号怎么穿过它,启动会慢多少?这篇逐项实测。
容器里 /proc/1/cmdline:/sbin/docker-init -- sleep 600 进程列表:PID PPID COMMAND COMMAND | 1 0 docker-init /sbin/docker-init -- sleep 600 | 7 1 sleep sleep 600 | 14 0 ps ps -o pid,ppid,comm,args /sbin/docker-init --version:tini version 0.19.0 - git.de40ad0 /sbin/docker-init 文件(权限 大小):-rwxr-xr-x 601296;不加 --init 的同一个镜像里有它吗?ls: /sbin/docker-init: No such file or directory /sbin/docker-init 来自哪里(mountinfo):968 959 0:26 /usr/libexec/docker/docker-init /sbin/docker-init ro,relatime - overlay overlay rw,lowerdir=/,upperdir=/run/rootfs.upper,workdi PID 1 的内存 VmRSS:VmRSS: 508 kB docker inspect 的 HostConfig.Init = true
--init 让 PID 1 变成 /sbin/docker-init -- 你的命令,它是 tini 0.19.0。这个文件不在镜像里,运行时从 Docker Desktop 虚拟机的 /usr/libexec/docker/docker-init 只读挂载进来,所以任何镜像都能用,也不改变镜像内容。你的程序变成 PID 7,父进程是 1。
子进程 exit 3:docker run 退出码 3 子进程 exit 3(不用 --init):docker run 退出码 3 子进程被 SIGKILL(kill -9 $$):docker run 退出码 137 子进程被 SIGTERM(kill -TERM $$):docker run 退出码 143 子进程被 SIGTERM(不用 --init,PID 1 是 sh):docker run 退出码 0
子进程 exit 3,docker run 的退出码就是 3;被信号杀死则是 128 加信号编号(137、143)。
--init:日志 ready | 子进程收到 SIGUSR1;Status=exited ExitCode=0 不用 --init:日志 ready | 子进程收到 SIGUSR1;Status=exited ExitCode=0
程序自己装了信号处理程序时,有没有 init 都能收到信号。init 的价值在没有处理程序的程序(c6)和孤儿进程收尸(c31)。
不用 --init:中位数 170 ms,最小 164,最大 191 --init:中位数 175 ms,最小 167,最大 208
PID 1 的 VmRSS 只有 508 kB,启动用时中位数 175 ms 对 170 ms,各 10 次,差别在抖动范围内。