我们 Docker base images 上的 S6-Overlay 3.x 更新
我们开始更新 base images 以使用新的 s6-Overlay v3。迁移文章也解释了围绕此变更的新可能性。这篇博客文章说明了使用我们的新 base images 所需的最小变更。
我们已经更新了我们的示例 add-on以包含新的行为。
最低要求
如果你的 add-on 的 config.yaml 中还没有,请添加 init: false。在 V3 中,S6 强制要求正确使用其 init。如果使用 Docker 默认系统 init,启动 add-on 时会看到以下错误:
确保你的 git repository rootfs 文件夹中的所有可执行/脚本文件已设置执行权限。你可以使用以下命令更新权限:
如果你在 S6-overlay services 中使用 finish 脚本(例如,在出错时停止容器),你需要将 s6-svscanctl -t /var/run/s6/services 替换为 /run/s6/basedir/bin/halt。
AppArmor
你需要调整你的 AppArmor profile 使其与新 s6-Overlay 配合工作。我们更新了文档中的默认 profile。需要进行以下更改:
host_pid 选项
未启用 protection mode 的 addons 可以在配置中设置 host_pid: true。如文档中所述:
允许容器在 host PID namespace 上运行。仅适用于未受保护的 add-ons。
这存在问题,因为 S6 期望自己是 PID 1(这在其标语中明确说明),而在使用 host PID namespace 时这是不可能的。
在 V2 中,S6 实际上并没有检查自己是否作为 PID 1 运行。这就是为什么过去在此模式下它"能工作"的原因(尽管它需要一些变通方法来防止 s6 以此方式运行时破坏系统)。在 V3 中,S6 检查自己是否确实是 PID 1,否则拒绝启动。
要解决此问题,不要在你的 addon 中使用 s6 overlay,因为它不是为此用例设计的。你可以通过用 no-op 脚本覆盖 /init 然后使用正常的 docker init 系统来继续使用 addon base images。或者你可以切换到其他 base image(如 stock alpine 或 debian)并添加所需的内容。

