diff --git a/nixos/modules/containers.nix b/nixos/modules/containers.nix index 9b49826..cef9188 100644 --- a/nixos/modules/containers.nix +++ b/nixos/modules/containers.nix @@ -62,6 +62,8 @@ let system = mkOpt' path "${ctrProfiles name}/system" "Path to NixOS system configuration."; containerSystem = mkOpt' path "/nix/var/nix/profiles/system" "Path to NixOS system configuration from within container."; autoStart = mkBoolOpt' true "Whether to start the container automatically at boot."; + hotReload = mkBoolOpt' true + "Whether to apply new configuration by running `switch-to-configuration` instead of rebooting the container."; # Yoinked from nixos/modules/virtualisation/nixos-containers.nix bindMounts = mkOption { @@ -167,24 +169,26 @@ in Bridge = c.networkZone; }; }; - services."systemd-nspawn@${n}" = { + services."systemd-nspawn@${n}" = + let + sysProfile = "${ctrProfiles n}/system"; + system = if + config.my.build.isDevVM then + systems."${n}".configuration.config.my.buildAs.container else + c.system; + containerSystem = if + config.my.build.isDevVM then + system else + c.containerSystem; + in + { # systemd.nspawn units can't set the root directory directly, but /run/machines/${n} is one of the search paths environment.root = "/run/machines/${n}"; restartTriggers = [ (''${n}.nspawn:${hashString "sha256" (toJSON config.systemd.nspawn."${n}")}'') ]; + preStart = - let - sysProfile = "${ctrProfiles n}/system"; - system = if - config.my.build.isDevVM then - systems."${n}".configuration.config.my.buildAs.container else - c.system; - containerSystem = if - config.my.build.isDevVM then - system else - c.containerSystem; - in '' mkdir -p -m 0755 \ /nix/var/nix/{profiles,gcroots}/per-container/${n} \ @@ -202,6 +206,16 @@ in touch "$root"/etc/os-release ln -sf "${containerSystem}"/init "$root"/sbin/init ''; + postStop = + '' + rm -rf "$root" + ''; + reload = + '' + [ -e "${system}"/bin/switch-to-configuration ] && \ + systemd-run --pipe --machine ${n} -- "${containerSystem}"/bin/switch-to-configuration test + ''; + wantedBy = optional c.autoStart "machines.target"; }; network.networks."80-container-${n}-vb" = { diff --git a/nixos/modules/deploy-rs.nix b/nixos/modules/deploy-rs.nix index fe3cc7b..64f4efc 100644 --- a/nixos/modules/deploy-rs.nix +++ b/nixos/modules/deploy-rs.nix @@ -6,12 +6,16 @@ let cfg = config.my.deploy; - ctrProfiles = optionalAttrs cfg.generate.containers.enable (mapAttrs' (n: c: { + ctrProfiles = optionalAttrs cfg.generate.containers.enable (mapAttrs' (n: c: + let + ctrConfig = systems."${n}".configuration.config; + in + { name = "container-${n}"; value = { - path = pkgs.deploy-rs.lib.activate.custom systems."${n}".configuration.config.my.buildAs.container + path = pkgs.deploy-rs.lib.activate.custom ctrConfig.my.buildAs.container '' - systemctl restart systemd-nspawn@${n} + systemctl ${if c.hotReload then "reload" else "restart"} systemd-nspawn@${n} ''; profilePath = "/nix/var/nix/profiles/per-container/${n}/system";