Project

General

Profile

DockerInit » History » Revision 4

Revision 3 (cryptogopher, 2022-04-28 21:40) → Revision 4/10 (cryptogopher, 2022-04-28 21:47)

h1. Container @init@ process 

 To enable running multiple processes, containers require process/service management. This is normally provided by some kind of @init@ task (e.g. provided by @sysvinit@). 

 There are Docker-compatible replacements for full-fledged @init@'s. @init@s. Unfortunately they require either custom init scripts or service configurations (https://wiki.gentoo.org/wiki/Comparison_of_init_systems). configurations. The process of migration from 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> 


 Nevertheless it is possible to use @sysvinit@ inside as a Docker container as an @init@ process. Required steps are following: 

 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@. 

 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>