Можно ли позволить Nix Package Manager устанавливать только зависимости во время выполнения? - PullRequest
0 голосов
/ 29 июня 2018

Я сейчас создаю несколько образов докера.

Я обнаружил, что дистрибутив 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

Важно сохранять образы докера тонкими, и я не думаю, что curl нужны зависимости, такие как gcc или linux-headers во время выполнения.

Есть ли способ для Nix исключить зависимости этих исходных или dev-библиотек?

1 Ответ

0 голосов
/ 30 июня 2018

Зависимости сборки становятся зависимостями времени выполнения всякий раз, когда в пакет включается имя пути к зависимости сборки. Это необходимо, потому что нет общего способа определить, действительно ли такая ссылка используется программой.

Лучший способ избежать построения зависимостей в ваших замыканиях - это не ссылаться на них в первую очередь. Следующая лучшая вещь - это понять, почему ссылка есть, и, если это безопасно, изменить скрипт сборки пакета, чтобы удалить ссылку.

Чтобы выяснить, откуда эти ссылки, вы можете использовать команду Nix 2.0 nix why-depends. Он сообщит вам кратчайший путь или все пути, которые ведут от первого пакета аргументов ко второму пакету аргументов. Вы также можете использовать пути к хранилищам вместо путей к атрибутам в примерах nix why-depends --help.

Метод удаления зависимости зависит от ссылочного пакета, поэтому для этого нет общей формулы. Существуют общие хаки для удаления ссылки небезопасными способами, но они, вероятно, не стоят риска.

...