DockerInit » History » Revision 8
Revision 7 (cryptogopher, 2022-04-28 21:57) → Revision 8/10 (cryptogopher, 2022-04-28 22:51)
h1. Container @init@ process h2. Problem To enable running multiple processes, containers require process/service management. This is normally provided by some kind of @init@ task (e.g. from @sysvinit@). There are Docker-compatible replacements for full-fledged @init@'s. Unfortunately they require either custom init scripts or service configurations (https://wiki.gentoo.org/wiki/Comparison_of_init_systems). The process of migration from OS-provided system provided OpenRC init scripts is time consuming and error prone. Usage of system's default @sysvinit@ is hampered by following shortcomings: * it mostly does not respond to Unix signals, which are used by Docker to manage containers (most importantly: signal termination), * it does not stop properly on container stop. Attempt to stop container with @init@ as PID 1 ends with error code 137: <pre> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b755c0f1b1d8 gentoo-base "/sbin/init" About a minute ago Exited (137) 9 seconds ago gentoo-base </pre> @init@ process remains running afterwards: <pre> # docker-compose top gentoo-base UID PID PPID C STIME TTY TIME CMD ---------------------------------------------------------- root 3510 3489 0 17:40 ? 00:00:00 init [0] </pre> h2. Solution Nevertheless it is possible to use @sysvinit@ inside Docker container as an @init@ process. Required steps are following: h3. 1. Change @sysvinit@ to exit @init@ process on hard shutdown (runlevel 0) with following patch <pre><code class="diff"> --- sysvinit-3.01/src/init.c 2021-12-13 20:21:26.000000000 +0100 +++ sysvinit-3.01/src/init.c 2022-04-18 01:21:47.966751774 +0200 @@ -2367,6 +2367,11 @@ read_inittab(); fail_cancel(); setproctitle("init [%c]", (int)runlevel); + + /* + * Exit on halt - causes Docker container to stop. + */ + if (runlevel == '0') exit(0); } } Write_Runlevel_Log(runlevel); </code></pre> On Gentoo it's enough to put this patch inside _/etc/portage/patches/sys-apps/sysvinit/exit-on-halt.patch_ and reemerge @sysvinit@. h3. 2. Change Docker signal for container termination to SIGINT and set appropriate action in @inittab@ Container's _docker-compose.yml_: <pre> services: gentoo-base: ... stop_signal: SIGINT </pre> _/etc/inittab_ inside container - replace reboot action with shutdown: <pre> # What to do at the "Three Finger Salute". ca:12345:ctrlaltdel:/sbin/shutdown -h now </pre>