Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 是否可以让Nix软件包管理器仅安装运行时依赖项?_Linux_Docker_Nix - Fatal编程技术网

Linux 是否可以让Nix软件包管理器仅安装运行时依赖项?

Linux 是否可以让Nix软件包管理器仅安装运行时依赖项?,linux,docker,nix,Linux,Docker,Nix,我目前正在构建一些docker图像 我发现在找到Nix之前,我使用的Linux发行版很难适应Docker多阶段构建 使用Nix,我可以在图像之间复制文件(copy--from=source/image/Nix/store/Nix/store),而不用担心冲突和破坏 但我发现它在运行nix env-I curl命令后安装了太多东西 warning: there are multiple derivations named 'curl-7.60.0'; using the first one ins

我目前正在构建一些docker图像

我发现在找到Nix之前,我使用的Linux发行版很难适应Docker多阶段构建

使用Nix,我可以在图像之间复制文件(
copy--from=source/image/Nix/store/Nix/store
),而不用担心冲突和破坏

但我发现它在运行
nix env-I curl
命令后安装了太多东西

warning: there are multiple derivations named 'curl-7.60.0'; using the first one
installing 'curl-7.60.0'
these paths will be fetched (49.44 MiB download, 203.64 MiB unpacked):
  /nix/store/0yaiablzxhd8ki5qan156ydz78grlav7-nghttp2-1.32.0-bin
  /nix/store/0zvcf4dnlcd4bk84qmxcxm1pbc534chv-openssl-1.0.2o-bin
  /nix/store/3xvnr0y2mx7g8b796rb9p77bjfbaw03h-linux-headers-4.15
  /nix/store/4bikvz91b83sycavf35lmby65m6zxgch-libssh2-1.8.0-dev
  /nix/store/504vcw350rp1yh31razv0mq2vsgp0izh-libkrb5-1.15.2-dev
  /nix/store/5gzy6cacylfb0lha2yd0i0as0k1d0d5v-libev-4.24
  /nix/store/5xnniwzazzlg6qinhrwammxxwsq5c1di-nghttp2-1.32.0-dev
  /nix/store/7l1smzwil1kxyyfayzl6lg1hw9m4iwmw-nghttp2-1.32.0
  /nix/store/8zkg9ac4s4alzyf4a8kfrig1j73z66dw-bash-4.4-p23
  /nix/store/93ljbaqhsipwamcn1acrv94jm6rjpcnd-acl-2.2.52
  /nix/store/dgp8mnf40pmwh8ghpcfda1vcwcy34w6z-curl-7.60.0-devdoc
  /nix/store/gbddfvxzjjqpgkr17whn8ynh9z8afz8l-curl-7.60.0-debug
  /nix/store/imfm3gk3qchmyv7684pjpm8irvkdrrkk-gcc-7.3.0
  /nix/store/jg9yh6cm4iwcpl4l18g7mr9y7sdwav5q-curl-7.60.0-dev
  /nix/store/jsmnk16iwb9xrm3c6jv2fyxkh7xr7q3j-curl-7.60.0-man
  /nix/store/lyd89mv72m8a0aw1a4idfimyi0rb2b13-glibc-2.27-dev
  /nix/store/n7qp8pffvcb5ff52l2nrc3g2wvxfrk75-coreutils-8.29
  /nix/store/pa4q0szxz23bd6srry91gmw08fmwgfw2-libkrb5-1.15.2
  /nix/store/q239yikz665n4a5rff7rg2vc7jpay6xb-openssl-1.0.2o-dev
  /nix/store/rmq6gnybmxxzpssj3s63sfjivlq4inrm-attr-2.4.47
  /nix/store/szdi35clpzj13c8dhfzh55fj6hk0z8j6-glibc-2.27-bin
  /nix/store/v5xh3glylamhfg586hcykn6hlk4n41dh-nghttp2-1.32.0-lib
  /nix/store/vawc9a89l53mf05yq0k1910q7dakd99w-perl-5.24.3
  /nix/store/vl5k9m1pjkd6cm9125afic1kj06y4i6b-curl-7.60.0-bin
  /nix/store/y8cfvcvya61l260jil989lcmkia5b5gh-zlib-1.2.11-dev
  /nix/store/z4k2pbdd8pz9mjc0p5394j0zp435fcc5-curl-7.60.0
保持docker映像苗条很重要,我认为curl在运行时不需要像gcc或linux头这样的依赖项


Nix是否有办法排除这些源库或开发库的依赖项?

只要包中包含生成依赖项的路径名,生成依赖项就会变成运行时依赖项。这是必要的,因为没有通用的方法来判断程序是否实际使用了这样的引用

避免闭包中存在构建依赖项的最佳方法是首先不引用它们。下一个最好的方法是理解引用存在的原因,如果安全的话,修改包构建脚本以删除引用

为了找出这些引用的来源,可以使用nix2.0
nixwhy depends
命令。它将告诉您从第一个参数包到第二个参数包的最短路径或所有路径。您还可以使用存储路径而不是
nix why dependens--help
示例中的属性路径


删除依赖项的方法取决于引用包,因此没有通用公式。以不安全的方式删除引用的一般黑客是存在的,但它们可能不值得冒险。

很大程度上取决于包管理器。例如,看起来除了运行时依赖项之外,还引入了构建依赖项。我不知道您或docker使用的软件包管理器是什么,但请寻找不安装build、可选或不符合建议的依赖项的选项。@DavidC.Rankin Nix(不要与*Nix混淆)软件包管理器的设计目的不是让人决定是否包含运行时依赖项,因为它通常是不必要的,而且容易出错。让软件决定什么是运行时依赖项是非常安全的,但可能包括从未实际使用过的引用。@RobertHensing-谢谢。我完全错过了。自从我创建了一个只有5百万字节的“HelloWorld”以来,我就避免了Docker的麻烦,而汇编语言中的“HelloWorld”是692字节,C语言中是6352字节。(自从openSuSE第一次推出Docker promise以来,这已经有一段时间了——我必须再试一次。您应该构建
curl
,然后将可执行文件添加到映像中,而不是将构建
curl
作为映像构建过程的一部分。请参阅类似使用Nix构建Docker映像的文章,而不是将Nix容器化建造。