【问题标题】:How can a build or test a smaller nixos container config independent of my host's Nixos config?如何独立于主机的 Nixos 配置构建或测试较小的 nixos 容器配置?
【发布时间】:2020-11-25 09:42:06
【问题描述】:

我正在尝试在 nixos containers 中配置一个容器,例如:

  containers.abc123 = {
    config = { config, pkgs, ... }:
    {
      systemd.services = {
        finder-email-requests = {
          description = "";
          enable = true;
          environment = {
              TESTING = "abcxyz";
          };
          serviceConfig = {
            Type      = "simple";

            ExecStart = "bash -c \"echo '$TESTING hello' >> /tmp/abcxyz\"";
            Restart   = "always";
            RestartSec   = 30;
          };
          wantedBy = [ "default.target" ];
        };
      };
    };
  };

然而,需要测试/编译这意味着运行 nixos-rebuild test 在我的机器上可能需要 10 多秒(或者在我刚刚尝试过的新安装的 VM 上需要 7 秒)。

有什么方法可以让我更快地独立于整个主机的 Nixos 配置来测试这个容器配置吗?例如,只构建容器配置本身而不是这个 nixos 配置的整个实例? p>


我发现nixos-rebuild 命令是一个小shell 脚本,例如https://github.com/NixOS/nixpkgs/blob/216f0e6ee4a65219f37caed95afda1a2c66188dc/nixos/modules/installer/tools/nixos-rebuild.sh

但是在阅读之后,我不太明白这个“容器”单元和一般的“nixos 配置”之间的关系是怎么回事。

【问题讨论】:

  • nixos-rebuild 是一个围绕激活脚本的非常通用包装器。它必须与其他 NixOS 版本兼容。如果您对容器的实现感兴趣,容器将被实现here
  • @Chris 我一直在谷歌上搜索有关 NixOS 容器的信息,结果遇到了github.com/erikarvstedt/extra-container - 这可能就是您要找的东西。

标签: nix nixos


【解决方案1】:

NixOS 容器没有自己的测试设施(截至 2020 年 11 月)。对于大多数意图和目的,它们的行为类似于普通的 NixOS 系统。如果你想测试你的容器,正常的 NixOS 测试就足够了。

编写 NixOS 测试是 NixOS 手册中的documented。您可以使用 pkgs.nixosTest 函数在 Nixpkgs 存储库之外编写自己的测试。

您可以使用容器测试主机系统的近似值,也可以只测试容器配置,就好像它是“顶级”NixOS 系统一样。我会选择后者,除非您需要同时测试多个容器,或者如果您需要测试主机和容器之间的交互。

但是,为了正确测试容器定义构建,我们可以使用pkg.nixos。例如,您的容器的 nix 表达式(可以使用通常的 nix-build 方法构建):

{ a = let pkgs = import <nixpkgs> {};
in (pkgs.nixos
{
  fileSystems."/".device = "x";
  boot.loader.grub.enable = false;

  systemd.services = {
          finder-email-requests-2 = {
            description = "";
            enable = true;
            environment = {
                TESTING = "abcxyz";
            };
            serviceConfig = {
              Type      = "simple";

              ExecStart = "bash -c \"echo '$TESTING hello' >> /tmp/abcxyz\"";
              Restart   = "always";
              RestartSec   = 30;
            };
            wantedBy = [ "default.target" ];
          };
        };
}).toplevel; 
}

【讨论】:

  • 嗯,我想这仍然不会比直接使用主机的 nixos 配置快吗?这是 10s +\- 等待我试图避免。
  • 一个最小的 NixOS 配置需要大约 3 秒来评估。在同一过程中评估更多的人会增加相似的数量。可以合理地假设容器也是如此。因此,在nixosTest 中将容器的配置测试为“主机”应该可以节省大约 3 秒。您的数字可能会有所不同。亲眼看看:time nix-instantiate --expr '{ a = let pkgs = import &lt;nixpkgs&gt; {}; in (pkgs.nixos { fileSystems."/".device = "x"; boot.loader.grub.enable = false; }).toplevel; }'。您还可以重复使用 pkgs 以获得约 0.5 秒的影响。另请参阅nixpkgs.pkgs 选项。
  • 我应该注意到nixosTest 不像nixos-rebuild test;它不会为您提供与之交互的虚拟机,但可以让您运行测试脚本。
  • @ChrisStryczynski 感谢您添加示例,但它调用的是nixos 函数而不是nixosTest。这更像是调用nixos-rebuild build,但可以合并到另一个表达式中并使用nix-build command 构建。
  • 对不起,从评论中复制了它 - 但它似乎完全符合我在我的问题中的想法(我的“测试”意图是 - 测试它是否成功“构建”)。我将尝试再次编辑答案以使其更加清晰,否则请随时回滚(我可以将其作为单独的答案)。
猜你喜欢
  • 2022-08-06
  • 2015-05-18
  • 2019-11-22
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
相关资源
最近更新 更多