【问题标题】:How do I apply a nix-shell config in a docker image?如何在 docker 映像中应用 nix-shell 配置?
【发布时间】:2019-10-16 20:48:49
【问题描述】:

我正在尝试使用 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


    【解决方案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 部分。

    【讨论】:

    • 感谢您的回答,我不太明白buildEnv 的用途,所以这很有帮助。
    【解决方案2】:

    这是神奇的命令:

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

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

    【讨论】:

    • 这会将它们安装为单独的包,而我的解决方案安装一个包含所有内容的“my-tools”包。这对nix-env -q、nix-env -e 很重要。什么是最好的取决于您的用例。对于 docker 映像,这无关紧要。
    • 是的,我意识到了这一点,这就是为什么你的答案是公认的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多