summaryrefslogtreecommitdiffstats
path: root/pkgs/tools/virtualization/nixos-container
diff options
context:
space:
mode:
authorMaximilian Bosch <maximilian@mbosch.me>2020-02-10 02:21:24 +0100
committerMaximilian Bosch <maximilian@mbosch.me>2020-02-11 14:42:30 +0100
commit93943acbc5d795a34a0f933d3b31094fc2c7b78f (patch)
tree8a4ab4853e3f38682431b78ad0b17b53620d147c /pkgs/tools/virtualization/nixos-container
parentc6fa3c201c1ef175ea58f5c0919b39a48a83bb3c (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-xpkgs/tools/virtualization/nixos-container/nixos-container.pl26
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") {