Containers: Fix reboot and poweroff
Previously "machinectl reboot/poweroff" brutally killed the container, as did "systemctl stop/restart". And reboot didn't actually work. Now everything is fine.
This commit is contained in:
parent
38567ddc80
commit
04ec038e89
@ -168,6 +168,9 @@ in
|
||||
|
||||
preStart =
|
||||
''
|
||||
# Clean up existing machined registration.
|
||||
machinectl terminate "$INSTANCE" 2> /dev/null || true
|
||||
|
||||
mkdir -p -m 0755 $root/var/lib
|
||||
|
||||
# Create a named pipe to get a signal when the container
|
||||
@ -203,6 +206,7 @@ in
|
||||
fi
|
||||
''}
|
||||
|
||||
EXIT_ON_REBOOT=1 \
|
||||
exec ${config.systemd.package}/bin/systemd-nspawn \
|
||||
--keep-unit \
|
||||
-M "$INSTANCE" -D "$root" $extraFlags \
|
||||
@ -240,13 +244,14 @@ in
|
||||
|
||||
preStop =
|
||||
''
|
||||
machinectl poweroff "$INSTANCE"
|
||||
machinectl poweroff "$INSTANCE" || true
|
||||
'';
|
||||
|
||||
restartIfChanged = false;
|
||||
#reloadIfChanged = true; # FIXME
|
||||
|
||||
serviceConfig.ExecReload = pkgs.writeScript "reload-container"
|
||||
serviceConfig = {
|
||||
ExecReload = pkgs.writeScript "reload-container"
|
||||
''
|
||||
#! ${pkgs.stdenv.shell} -e
|
||||
SYSTEM_PATH=/nix/var/nix/profiles/system
|
||||
@ -254,9 +259,23 @@ in
|
||||
${pkgs.socat}/bin/socat unix:$root/var/lib/run-command.socket -
|
||||
'';
|
||||
|
||||
serviceConfig.SyslogIdentifier = "container %i";
|
||||
SyslogIdentifier = "container %i";
|
||||
|
||||
serviceConfig.EnvironmentFile = "-/etc/containers/%i.conf";
|
||||
EnvironmentFile = "-/etc/containers/%i.conf";
|
||||
|
||||
# Note that on reboot, systemd-nspawn returns 10, so this
|
||||
# unit will be restarted. On poweroff, it returns 0, so the
|
||||
# unit won't be restarted.
|
||||
Restart = "on-failure";
|
||||
|
||||
# Hack: we don't want to kill systemd-nspawn, since we call
|
||||
# "machinectl poweroff" in preStop to shut down the
|
||||
# container cleanly. But systemd requires sending a signal
|
||||
# (at least if we want remaining processes to be killed
|
||||
# after the timeout). So send an ignored signal.
|
||||
KillMode = "mixed";
|
||||
KillSignal = "WINCH";
|
||||
};
|
||||
};
|
||||
|
||||
# Generate a configuration file in /etc/containers for each
|
||||
|
Loading…
Reference in New Issue
Block a user