diff options
author | Maximilian Bosch <maximilian@mbosch.me> | 2020-02-10 02:21:24 +0100 |
---|---|---|
committer | Maximilian Bosch <maximilian@mbosch.me> | 2020-02-11 14:42:30 +0100 |
commit | 93943acbc5d795a34a0f933d3b31094fc2c7b78f (patch) | |
tree | 8a4ab4853e3f38682431b78ad0b17b53620d147c /pkgs/tools/virtualization/nixos-container | |
parent | c6fa3c201c1ef175ea58f5c0919b39a48a83bb3c (diff) |
nixos/nixos-container: ensure that the state-dir is cleaned up if a build fails
Diffstat (limited to 'pkgs/tools/virtualization/nixos-container')
-rwxr-xr-x | pkgs/tools/virtualization/nixos-container/nixos-container.pl | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/pkgs/tools/virtualization/nixos-container/nixos-container.pl b/pkgs/tools/virtualization/nixos-container/nixos-container.pl index 727c0333b275..a14926a9767b 100755 --- a/pkgs/tools/virtualization/nixos-container/nixos-container.pl +++ b/pkgs/tools/virtualization/nixos-container/nixos-container.pl @@ -149,6 +149,16 @@ sub buildFlake { unlink("$systemPath.tmp"); } +sub clearContainerState { + my ($profileDir, $gcRootsDir, $root, $configFile) = @_; + + safeRemoveTree($profileDir) if -e $profileDir; + safeRemoveTree($gcRootsDir) if -e $gcRootsDir; + system("chattr", "-i", "$root/var/empty") if -e "$root/var/empty"; + safeRemoveTree($root) if -e $root; + unlink($configFile) or die; +} + if ($action eq "create") { # Acquire an exclusive lock to prevent races with other # invocations of ‘nixos-container create’. @@ -226,7 +236,10 @@ if ($action eq "create") { if (defined $systemPath) { system("nix-env", "-p", "$profileDir/system", "--set", $systemPath) == 0 - or die "$0: failed to set initial container configuration\n"; + or do { + clearContainerState($profileDir, "$profileDir/$containerName", $root, $confFile); + die "$0: failed to set initial container configuration\n"; + }; } else { mkpath("$root/etc/nixos", 0, 0755); @@ -237,7 +250,10 @@ if ($action eq "create") { system("nix-env", "-p", "$profileDir/system", "-I", "nixos-config=$nixosConfigFile", "-f", "$nixenvF", "--set", "-A", "system") == 0 - or die "$0: failed to build initial container configuration\n"; + or do { + clearContainerState($profileDir, "$profileDir/$containerName", $root, $confFile); + die "$0: failed to build initial container configuration\n" + }; } print "$containerName\n" if $ensureUniqueName; @@ -331,11 +347,7 @@ if ($action eq "destroy") { terminateContainer if (isContainerRunning); - safeRemoveTree($profileDir) if -e $profileDir; - safeRemoveTree($gcRootsDir) if -e $gcRootsDir; - system("chattr", "-i", "$root/var/empty") if -e "$root/var/empty"; - safeRemoveTree($root) if -e $root; - unlink($confFile) or die; + clearContainerState($profileDir, $gcRootsDir, $root, $confFile); } elsif ($action eq "restart") { |