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

Wil*_*llW 5 docker gitlab-ci nix

我正在尝试使用 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但失败了,“这个派生不是为了构建,不是为了中止”。

提前致谢。

Rob*_*ing 6

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

默认.nix

{ pkgs ? import <nixpkgs> {} }:

pkgs.buildEnv {
  name = "my-tools";
  paths = [
    pkgs.hello
    pkgs.figlet
  ];
}
Run Code Online (Sandbox Code Playgroud)

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

nix-env -i -f default.nix
Run Code Online (Sandbox Code Playgroud)

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

{ pkgs ? import <nixpkgs> {} }:

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

另请参阅Nixpkgs 手册中的声明性包管理部分。