about summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-08-19 15:47:51 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-08-19 18:24:44 +0200
commitddd8f0cf661e2c1818eb19476a2d62a417de4873 (patch)
tree1002bf5699aed7e22deadb26135cce4614da5fe7 /nixos
parentf932910323bf7188f70c49789ce85392c36e06b4 (diff)
downloadnixlib-ddd8f0cf661e2c1818eb19476a2d62a417de4873.tar
nixlib-ddd8f0cf661e2c1818eb19476a2d62a417de4873.tar.gz
nixlib-ddd8f0cf661e2c1818eb19476a2d62a417de4873.tar.bz2
nixlib-ddd8f0cf661e2c1818eb19476a2d62a417de4873.tar.lz
nixlib-ddd8f0cf661e2c1818eb19476a2d62a417de4873.tar.xz
nixlib-ddd8f0cf661e2c1818eb19476a2d62a417de4873.tar.zst
nixlib-ddd8f0cf661e2c1818eb19476a2d62a417de4873.zip
nixos-container --create: Add option --system-path
This allows creating a container from an existing system store path,
which is especially nice for NixOps-deployed hosts because they don't
need a Nixpkgs tree anymore.
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/virtualisation/nixos-container.pl28
1 files changed, 18 insertions, 10 deletions
diff --git a/nixos/modules/virtualisation/nixos-container.pl b/nixos/modules/virtualisation/nixos-container.pl
index 3975e4b62f23..06839874ef02 100644
--- a/nixos/modules/virtualisation/nixos-container.pl
+++ b/nixos/modules/virtualisation/nixos-container.pl
@@ -17,7 +17,7 @@ umask 0022;
 sub showHelp {
     print <<EOF;
 Usage: nixos-container list
-       nixos-container create <container-name> [--config <string>] [--ensure-unique-name] [--auto-start]
+       nixos-container create <container-name> [--system-path <path>] [--config <string>] [--ensure-unique-name] [--auto-start]
        nixos-container destroy <container-name>
        nixos-container start <container-name>
        nixos-container stop <container-name>
@@ -31,6 +31,7 @@ EOF
     exit 0;
 }
 
+my $systemPath;
 my $ensureUniqueName = 0;
 my $autoStart = 0;
 my $extraConfig;
@@ -39,6 +40,7 @@ GetOptions(
     "help" => sub { showHelp() },
     "ensure-unique-name" => \$ensureUniqueName,
     "auto-start" => \$autoStart,
+    "system-path=s" => \$systemPath,
     "config=s" => \$extraConfig
     ) or exit 1;
 
@@ -132,11 +134,6 @@ if ($action eq "create") {
 
     print STDERR "host IP is $hostAddress, container IP is $localAddress\n";
 
-    mkpath("$root/etc/nixos", 0, 0755);
-
-    my $nixosConfigFile = "$root/etc/nixos/configuration.nix";
-    writeNixOSConfig $nixosConfigFile;
-
     # The per-container directory is restricted to prevent users on
     # the host from messing with guest users who happen to have the
     # same uid.
@@ -145,10 +142,21 @@ if ($action eq "create") {
     $profileDir = "$profileDir/$containerName";
     mkpath($profileDir, 0, 0755);
 
-    system("nix-env", "-p", "$profileDir/system",
-           "-I", "nixos-config=$nixosConfigFile", "-f", "<nixpkgs/nixos>",
-           "--set", "-A", "system") == 0
-        or die "$0: failed to build initial container configuration\n";
+    # Build/set the initial configuration.
+    if (defined $systemPath) {
+        system("nix-env", "-p", "$profileDir/system", "--set", $systemPath) == 0
+            or die "$0: failed to set initial container configuration\n";
+    } else {
+        mkpath("$root/etc/nixos", 0, 0755);
+
+        my $nixosConfigFile = "$root/etc/nixos/configuration.nix";
+        writeNixOSConfig $nixosConfigFile;
+
+        system("nix-env", "-p", "$profileDir/system",
+               "-I", "nixos-config=$nixosConfigFile", "-f", "<nixpkgs/nixos>",
+               "--set", "-A", "system") == 0
+            or die "$0: failed to build initial container configuration\n";
+    }
 
     print "$containerName\n" if $ensureUniqueName;
     exit 0;