简而言之:我需要在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 = "/";
};
}
发布于 2020-07-19 23:10:26
答案比我预期的要简单:如果您将contents
定义为一个列表而不是一个原子,那么派生将被组合到最终的图像中。
对于这个特定的情况,解决方案是更改
contents = foobar_deriv;
至
contents = [ foobar_deriv file ];
在实践中,我添加了更多的实用程序,这样我就可以根据需要四处查看,所以它变成了
contents = [ foobar_deriv file bash which coreutils ];
https://stackoverflow.com/questions/62981500
复制相似问题