Docker镜像多进程实践
- 2025-09-02 22:04:00
- 丁国栋
- 原创 42
在阅读本文之前,建议先看看这篇《Docker容器多进程管理工具s6》,本文也是基于 S6 来管理容器的进程。与前文不同的是,本文使用的是更为精简的 s6-overlay。
s6-overlay 在 GitHub 上也有很高的赞和派生,尺寸比 s6 更小,但实际用起来有一些不太顺手,特别是分开打包和 Entrypoint 的设计,使用起来不是很方便。
因为我们有一个古老的环境是 CentOS7 的,因此我需要制作一个 CentOS7 的镜像,需要支持 SSH 和 HTTP 服务。因为之前有 s6 的使用经验,所以本次还是使用 s6 ,但在 Google 搜索时又搜索到了之前没有搞清楚的 s6-overlay ,我看到它很高的 star 和 fork 陷入沉思,为什么我不使用它呢?
我选择 s6-overlay 的原因有两个:
1. CentOS7 默认是没有 s6 软件包的 ;
2. s6 安装需要自己编译,而 s6-overlay 不需要自己编译,直接可以二进制集成入 Docker 镜像;
在 x86 架构的 CPU中集成 s6-overlay 需要两个包:s6-overlay-noarch 和 s6-overlay-x86_64,可以在 release 页面获取。
我觉得在 s6-overlay-noarch 包中的 init Entrypoint 脚本有点不好用,在阅读两遍文档后没有发现很好的例子,因此无法跑通。因此我自己手动编写了一个简单的 Entrypoint。
#!/bin/bash set -o errexit set -o nounset set -o pipefail if [ $# -gt 0 ]; then exec "$@" else /etc/s6/s6-init/run || exit 1 exec /command/s6-svscan /etc/s6/s6-enable fi如果只是运行镜像执行 bash 就会进入bash (比如 docker run --rm -it example/name:tag bash),否则就会执行主进程 s6-svscan 。
虽然文档中总是建议从 GitHub 下载 s6-overlay-noarch 和 s6-overlay-x86_64 ,但我的建议是先下载到本地再 ADD 到镜像中。以下是一个 Dockerfile 的例子。
FROM centos:7 ENV S6_URL="https://github.com/just-containers/s6-overlay/tree/master" ENV S6_VERSION="3.2.1.0" RUN sed -e "s|^mirrorlist=|#mirrorlist=|g" \ -e "s|^#baseurl=http://mirror.centos.org/centos/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.9.2009|g" \ -e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.9.2009|g" \ -i.bak \ /etc/yum.repos.d/CentOS-*.repo && yum makecache && yum install -y openssh-server && yum clean all COPY rootfs / ENTRYPOINT ["/entrypoint.sh"]注:所需的文件都放在 rootfs 目录下。
注:在这个 Dockerfile 中,使用 yum clean all 的目的是减少镜像的尺寸,不要小看这个命令它可以减少接近 400MB 呢。
--