summary refs log tree commit diff
path: root/nixos/modules/virtualisation/containers.nix
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-04-01 16:02:53 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-04-03 16:36:23 +0200
commit1ad9a654be1120a6844c9eb7520188e874178ebe (patch)
tree82a855f1deffb13075e878ad3c42e38339e644e7 /nixos/modules/virtualisation/containers.nix
parent269926df0d1e0b03b9697f84e5b9720fa966b293 (diff)
downloadnixlib-1ad9a654be1120a6844c9eb7520188e874178ebe.tar
nixlib-1ad9a654be1120a6844c9eb7520188e874178ebe.tar.gz
nixlib-1ad9a654be1120a6844c9eb7520188e874178ebe.tar.bz2
nixlib-1ad9a654be1120a6844c9eb7520188e874178ebe.tar.lz
nixlib-1ad9a654be1120a6844c9eb7520188e874178ebe.tar.xz
nixlib-1ad9a654be1120a6844c9eb7520188e874178ebe.tar.zst
nixlib-1ad9a654be1120a6844c9eb7520188e874178ebe.zip
Make starting a container synchronous
So now "systemctl start container@foo" will only return after the
container has reached multi-user.target.
Diffstat (limited to 'nixos/modules/virtualisation/containers.nix')
-rw-r--r--nixos/modules/virtualisation/containers.nix25
1 files changed, 22 insertions, 3 deletions
diff --git a/nixos/modules/virtualisation/containers.nix b/nixos/modules/virtualisation/containers.nix
index 6c8a6f876c8d..9be79cec3695 100644
--- a/nixos/modules/virtualisation/containers.nix
+++ b/nixos/modules/virtualisation/containers.nix
@@ -150,11 +150,21 @@ in
         path = [ pkgs.iproute ];
 
         environment.INSTANCE = "%i";
+        environment.root = "/var/lib/containers/%i";
+
+        preStart =
+          ''
+            mkdir -p -m 0755 $root/var/lib
+
+            # Create a named pipe to get a signal when the container
+            # has finished booting.
+            rm -f $root/var/lib/startup-done
+            mkfifo $root/var/lib/startup-done
+         '';
 
         script =
           ''
-            root="/var/lib/containers/$INSTANCE"
-            mkdir -p -m 0755 "$root/etc"
+            mkdir -p -m 0755 "$root/etc" "$root/var/lib"
             if ! [ -e "$root/etc/os-release" ]; then
               touch "$root/etc/os-release"
             fi
@@ -209,6 +219,13 @@ in
               "$SYSTEM_PATH/init"
           '';
 
+        postStart =
+          ''
+            # This blocks until the container-startup-done service
+            # writes something to this pipe.
+            read x < $root/var/lib/startup-done
+          '';
+
         preStop =
           ''
             pid="$(cat /sys/fs/cgroup/systemd/machine/$INSTANCE.nspawn/system/tasks 2> /dev/null)"
@@ -238,8 +255,10 @@ in
               . "/etc/containers/$INSTANCE.conf"
             fi
             echo $SYSTEM_PATH/bin/switch-to-configuration test | \
-              ${pkgs.socat}/bin/socat unix:/var/lib/containers/$INSTANCE/var/lib/root-shell.socket -
+              ${pkgs.socat}/bin/socat unix:$root/var/lib/root-shell.socket -
           '';
+
+        serviceConfig.SyslogIdentifier = "container %i";
       };
 
     # Generate a configuration file in /etc/containers for each