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

问题描述 投票:1回答:2

我正在尝试使用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的东西,但是失败了,“该推导并不旨在构建,正在中止”。

提前感谢。

docker gitlab-ci nix
2个回答
1
投票

您可以使用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部分。


0
投票

这是魔术命令:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.