
s6-overlay 是一款专为 Docker 容器环境设计的轻量级初始化(init)系统和进程管理工具。它基于 s6 这套 Unix 初始化工具集,旨在解决容器内多进程管理、僵尸进程回收、优雅启停等问题,同时保持容器“单一职责”的理念。
安装非常简单,只需要下载几个tar包,在镜像根路径解压下,然后让/init作为ENTRYPOINT :
FROM ubuntu
ARG S6_OVERLAY_VERSION=3.2.1.0
# 安装启动你想要的主进程
RUN apt-get update && apt-get install -y nginx xz-utils
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
CMD ["/usr/sbin/nginx"]
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-x86_64.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-x86_64.tar.xz
ENTRYPOINT ["/init"]您的 CMD 可以在 Dockerfile 中构建时给出,也可以在命令行上运行时给出,两种方式都可以。它将在 s6 设置的环境中作为正常进程运行;当它失败或退出时,容器将干净利落地关闭并退出。你可以用这种方式运行交互式程序:只有 CMD 会收到你的交互式命令,支持进程不会受到影响。
有两种方式添加更多的守护进程或叫被监督的进程(services supervised)
方法一:(旧方式)
在 /etc/services.d/ 下创建服务名路径,内部有一个写有启动命令的run文件:
例如,创建文件 /etc/services.d/myapp/run
#!/command/execlineb -P
nginx -g "daemon off;"方法二:(新方式)
可以配置不同的服务类型,比如长期运行的(longrun)、运行一次的(oneshots)、分组(bundle)这种方式允许定义服务间的依赖。
这种方式在路径 /etc/s6-overlay/s6-rc.d/ 中进行配置。
如下是一个示例:

其他一些功能:
修复文件属主和权限、容器的初始化脚本、容器的退出脚本等。也分为旧方式和新方式。旧方式是在对应路径写脚本,新方式是在s6-rc.d中配置相关的文件。
提供的日志功能,可以把服务的标准输出定向到指定的日志文件。
还可以通过预定义的环境变量,自定义一些行为。
更多的用法细节详见仓库的README文件:https://github.com/just-containers/s6-overlay