如何在 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
列表作为要安装到环境中的派生列表。这更简单,但与罗伯特的回答相比,关注点的分离不太清晰。
我正在尝试使用 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
列表作为要安装到环境中的派生列表。这更简单,但与罗伯特的回答相比,关注点的分离不太清晰。