如何在 docker 图像中应用 nix-shell 配置?

How do I apply a nix-shell config in a docker image?

我正在尝试使用 Nix 来统一我的本地开发环境和我正在使用的基于 docker 的 Gitlab CI 构建。

我有一个简单的 shell.nix 可以完美运行 - 我可以在本地 运行 nix-shell 并获得我需要的一切。

如果,在我的 CI 配置中,然后我使用 nixos/nix:latest 作为我的 docker 图像,并用 nix-shell --run "xxx" 包围每个命令,一切正常。到处都是 nix-shell 维护起来很乏味,而且很难阅读实际发生的事情。我想做的是将该配置作为第一个命令以某种方式应用于 docker 图像,以便该环境可用于所有后续构建命令。

我想我想要的是 nix-env -f shell.nix -i 之类的东西,但它失败了,并显示“此推导不打算构建,正在中止”。

提前致谢。

您可以使用 buildEnv 将您的工具组合成一个推导。

default.nix:

{ pkgs ? import <nixpkgs> {} }:

pkgs.buildEnv {
  name = "my-tools";
  paths = [
    pkgs.hello
    pkgs.figlet
  ];
}

现在您可以在 docker 映像中安装您的工具:

nix-env -i -f default.nix

并在你的shell.nix中使用它:

{ pkgs ? import <nixpkgs> {} }:

pkgs.mkShell {
  name = "shell-dummy";
  buildInputs = [ (import ./default.nix { inherit pkgs; }) ];
}

另请参阅 Nixpkgs 手册中的 Declarative Package Management 部分。

这是神奇的命令:

nix-env -f shell.nix -i -A buildInputs

这使用 mkShell 中的 buildInputs 列表作为要安装到环境中的派生列表。这更简单,但与罗伯特的回答相比,关注点的分离不太清晰。