Merge pull request #106767 from erikarvstedt/fix-container-pkgs-2
nixos-container: fix `nixpkgs` container options being ignored
This commit is contained in:
commit
3c6035cd9a
|
@ -463,21 +463,15 @@ in
|
||||||
{ config, options, name, ... }:
|
{ config, options, name, ... }:
|
||||||
{
|
{
|
||||||
options = {
|
options = {
|
||||||
|
|
||||||
config = mkOption {
|
config = mkOption {
|
||||||
description = ''
|
description = ''
|
||||||
A specification of the desired configuration of this
|
A specification of the desired configuration of this
|
||||||
container, as a NixOS module.
|
container, as a NixOS module.
|
||||||
'';
|
'';
|
||||||
type = let
|
type = lib.mkOptionType {
|
||||||
confPkgs = if config.pkgs == null then pkgs else config.pkgs;
|
|
||||||
in lib.mkOptionType {
|
|
||||||
name = "Toplevel NixOS config";
|
name = "Toplevel NixOS config";
|
||||||
merge = loc: defs: (import (confPkgs.path + "/nixos/lib/eval-config.nix") {
|
merge = loc: defs: (import "${toString config.nixpkgs}/nixos/lib/eval-config.nix" {
|
||||||
inherit system;
|
inherit system;
|
||||||
pkgs = confPkgs;
|
|
||||||
baseModules = import (confPkgs.path + "/nixos/modules/module-list.nix");
|
|
||||||
inherit (confPkgs) lib;
|
|
||||||
modules =
|
modules =
|
||||||
let
|
let
|
||||||
extraConfig = {
|
extraConfig = {
|
||||||
|
@ -526,12 +520,18 @@ in
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
pkgs = mkOption {
|
nixpkgs = mkOption {
|
||||||
type = types.nullOr types.attrs;
|
type = types.path;
|
||||||
default = null;
|
default = pkgs.path;
|
||||||
example = literalExample "pkgs";
|
defaultText = "pkgs.path";
|
||||||
description = ''
|
description = ''
|
||||||
Customise which nixpkgs to use for this container.
|
A path to the nixpkgs that provide the modules, pkgs and lib for evaluating the container.
|
||||||
|
|
||||||
|
To only change the <literal>pkgs</literal> argument used inside the container modules,
|
||||||
|
set the <literal>nixpkgs.*</literal> options in the container <option>config</option>.
|
||||||
|
Setting <literal>config.nixpkgs.pkgs = pkgs</literal> speeds up the container evaluation
|
||||||
|
by reusing the system pkgs, but the <literal>nixpkgs.config</literal> option in the
|
||||||
|
container config is ignored in this case.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -672,14 +672,31 @@ in
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Removed option. See `checkAssertion` below for the accompanying error message.
|
||||||
|
pkgs = mkOption { visible = false; };
|
||||||
} // networkOptions;
|
} // networkOptions;
|
||||||
|
|
||||||
config = mkMerge
|
config = let
|
||||||
[
|
# Throw an error when removed option `pkgs` is used.
|
||||||
(mkIf options.config.isDefined {
|
# Because this is a submodule we cannot use `mkRemovedOptionModule` or option `assertions`.
|
||||||
path = config.config.system.build.toplevel;
|
optionPath = "containers.${name}.pkgs";
|
||||||
})
|
files = showFiles options.pkgs.files;
|
||||||
];
|
checkAssertion = if options.pkgs.isDefined then throw ''
|
||||||
|
The option definition `${optionPath}' in ${files} no longer has any effect; please remove it.
|
||||||
|
|
||||||
|
Alternatively, you can use the following options:
|
||||||
|
- containers.${name}.nixpkgs
|
||||||
|
This sets the nixpkgs (and thereby the modules, pkgs and lib) that
|
||||||
|
are used for evaluating the container.
|
||||||
|
|
||||||
|
- containers.${name}.config.nixpkgs.pkgs
|
||||||
|
This only sets the `pkgs` argument used inside the container modules.
|
||||||
|
''
|
||||||
|
else null;
|
||||||
|
in {
|
||||||
|
path = builtins.seq checkAssertion
|
||||||
|
mkIf options.config.isDefined config.config.system.build.toplevel;
|
||||||
|
};
|
||||||
}));
|
}));
|
||||||
|
|
||||||
default = {};
|
default = {};
|
||||||
|
|
|
@ -1,42 +1,34 @@
|
||||||
# Test for NixOS' container support.
|
|
||||||
|
|
||||||
import ./make-test-python.nix ({ pkgs, lib, ...} : let
|
import ./make-test-python.nix ({ pkgs, lib, ...} : let
|
||||||
|
|
||||||
customPkgs = pkgs // {
|
customPkgs = pkgs.appendOverlays [ (self: super: {
|
||||||
hello = pkgs.hello.overrideAttrs(old: {
|
hello = super.hello.overrideAttrs (old: {
|
||||||
name = "custom-hello";
|
name = "custom-hello";
|
||||||
});
|
});
|
||||||
};
|
}) ];
|
||||||
|
|
||||||
in {
|
in {
|
||||||
name = "containers-hosts";
|
name = "containers-custom-pkgs";
|
||||||
meta = with lib.maintainers; {
|
meta = with lib.maintainers; {
|
||||||
maintainers = [ adisbladis ];
|
maintainers = [ adisbladis earvstedt ];
|
||||||
};
|
};
|
||||||
|
|
||||||
machine =
|
machine = { config, ... }: {
|
||||||
{ ... }:
|
assertions = let
|
||||||
{
|
helloName = (builtins.head config.containers.test.config.system.extraDependencies).name;
|
||||||
virtualisation.memorySize = 256;
|
in [ {
|
||||||
virtualisation.vlans = [];
|
assertion = helloName == "custom-hello";
|
||||||
|
message = "Unexpected value: ${helloName}";
|
||||||
|
} ];
|
||||||
|
|
||||||
containers.simple = {
|
containers.test = {
|
||||||
autoStart = true;
|
autoStart = true;
|
||||||
pkgs = customPkgs;
|
config = { pkgs, config, ... }: {
|
||||||
config = {pkgs, config, ... }: {
|
nixpkgs.pkgs = customPkgs;
|
||||||
environment.systemPackages = [
|
system.extraDependencies = [ pkgs.hello ];
|
||||||
pkgs.hello
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
testScript = ''
|
# This test only consists of evaluating the test machine
|
||||||
start_all()
|
testScript = "";
|
||||||
machine.wait_for_unit("default.target")
|
|
||||||
machine.succeed(
|
|
||||||
"test $(nixos-container run simple -- readlink -f /run/current-system/sw/bin/hello) = ${customPkgs.hello}/bin/hello"
|
|
||||||
)
|
|
||||||
'';
|
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue