【问题标题】:Is it possible to let Nix Package Manager to install runtime dependencies only?是否可以让 Nix 包管理器只安装运行时依赖项?
【发布时间】:2018-06-29 19:51:34
【问题描述】:

我目前正在构建一些 docker 镜像。

我发现我使用的 Linux 发行版很难适应 Docker 多阶段构建,直到我找到了 Nix。

使用 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-headers 这样的依赖项。

Nix 有没有办法排除这些源库或开发库的依赖关系?

【问题讨论】:

  • 很大程度上取决于包管理器。例如,除了 run-time 依赖项之外,您似乎还引入了 build 依赖项。我不知道您或 docker 使用什么包管理器,但请寻找不安装构建、可选或杂散推荐依赖项的选项。
  • @DavidC.Rankin Nix(不要与 *NIX 混淆)包管理器并非旨在让人类决定将哪些内容包含为运行时依赖项,因为它通常是不必要的并且有点错误易于。让软件决定什么是运行时依赖是非常安全的,但可能包含从未实际使用过的引用。
  • @RobertHensing - 谢谢。我完全错过了。自从我构建了一个只有 5M 的“Hello World”,而汇编中的 692 字节“Hello World”或 C 中的 6352 字节相比,我已经避免像瘟疫一样使用 Docker。(自从 openSuSE 首次推出 Docker 承诺以来,这已经有一段时间了-- 我得再试一次。
  • 您应该构建curl,然后将可执行文件添加到镜像中,而不是构建curl 作为镜像构建过程的一部分。请参阅 lethalman.blogspot.com/2016/04/… 之类的帖子,以使用 Nix 构建 Docker 映像,而不是将 Nix 构建容器化。

标签: linux docker nix


【解决方案1】:

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

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

为了找出这些引用的来源,您可以使用 Nix 2.0 nix why-depends 命令。它将告诉您最短路径,或从第一个参数包到第二个参数包的所有路径。您也可以使用商店路径代替nix why-depends --help 示例中的属性路径。

移除依赖的方法取决于引用的包,所以没有通用的公式。存在以不安全方式删除引用的一般技巧,但它们可能不值得冒险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    相关资源
    最近更新 更多