【问题标题】:How do I install Nix packages on a Nixos docker image?如何在 Nixos docker 映像上安装 Nix 包?
【发布时间】:2020-11-08 21:14:18
【问题描述】:

短版:我需要在 Docker 映像中包含 file 实用程序。源环境和目标环境都是 NixOS。如何定义 docker 映像以便另一个可执行文件可以调用它,或者任何其他预打包的可执行文件?

更长的版本:我已经成功构建了一个 docker 镜像,我将一个预编译的可执行文件复制到适当的位置。该可执行文件现在需要调用 file 实用程序来识别各种文件的 MIME 类型,这就是我遇到的问题。

像我在shell.nix 中那样使用buildInputs 并没有达到预期的效果。有人能指出我需要的线索吗?

我的docker.nix如下:

with import <nixpkgs> {};

let
    foobar_deriv = stdenv.mkDerivation rec {
        name = "foobar";
        builder = "${bash}/bin/bash";
        args = [ ./nix-builder.sh ];
        inherit coreutils openssl libyaml;
        system = builtins.currentSystem;
        schemapath = ../../schemas;
        foobarpath = ./foobar;

        buildInputs = [
            pkgs.bash
            pkgs.file
        ];
        env = buildEnv {
            name = name;
            paths = buildInputs;
        };

    };

    ld_path = stdenv.lib.makeLibraryPath [
        pkgs.openssl
        pkgs.libyaml
    ];

    entrypoint = writeScript "entrypoint.sh" ''
    #!${stdenv.shell}
    export LD_LIBRARY_PATH=${ld_path}
    exec $@
    '';

in
pkgs.dockerTools.buildImage {
    name = "myaccount/foobar";
    tag = "0.3.0a11";
    created = "now";

    contents = foobar_deriv;

    config = {
        Cmd = [ "foobar" ];
        Entrypoint = [ entrypoint ];
        ExposedPorts = {
            "4949/tcp" = {};
        };
        WorkingDir = "/";
    };
}

【问题讨论】:

    标签: docker nixos


    【解决方案1】:

    答案比我预期的要简单:如果您将 contents 定义为列表而不是原子,则派生将组合到最终图像中。

    对于这种特殊情况,解决方案是改变

    contents = foobar_deriv;
    

    contents = [ foobar_deriv file ];
    

    在实践中,我添加了更多实用程序,以便我可以根据需要四处寻找,所以它变成了

    contents = [ foobar_deriv file bash which coreutils ];
    

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 2021-02-26
      • 2016-09-08
      • 2019-09-03
      • 2018-06-06
      • 2020-10-20
      • 2017-12-21
      • 1970-01-01
      • 2018-12-02
      相关资源
      最近更新 更多