Как создать докер-контейнер с помощью nix?

У меня есть пакет Nix, который я хотел бы объединить в док-контейнер.

В частности, я хочу использовать Nix как более выразительную альтернативу Dockerfile для более быстрой (нелинейной) сборки образов.

Я нашел документацию на dockerTools.buildImage, но мне хотелось бы иметь минимальный рабочий пример, и я также хотел бы знать, что в конечном итоге окажется в контейнере докера.


person nh2    schedule 12.04.2017    source источник


Ответы (1)


Следующий пример упаковывает (используя contents =) пакет pkgs.nginx nixpkgs в док-контейнер:

docker load --input $(nix-build -E 'with import <nixpkgs> {}; pkgs.dockerTools.buildImage { name = "nix-htop"; contents = pkgs.htop; config = { Cmd = [ "/bin/htop" ]; }; }')

Затем вы можете запустить его с помощью

docker run -it nix-htop

Содержимое контейнера довольно минимальное, один слой Docker:

docker save nix-htop | tar x --to-stdout --wildcards '*/layer.tar' | tar t --exclude="*/*/*/*"
./
./bin/
./bin/htop
./share/
./share/applications/
./share/man/
./share/pixmaps/
nix/
nix/store/
nix/store/gi5vvbjawzw1bakiksazbd50bvfmpmmc-ncurses-6.0/
nix/store/pa5nkrpd5hg5qp1dc4gmbd2vdhn1y3x2-htop-2.0.2/
nix/store/vn6fkjnfps37wa82ri4mwszwvnnan6sk-glibc-2.25/

Только htop и его зависимости (glibc, ncurses), в моем случае 26 МБ.

person nh2    schedule 12.04.2017
comment
В macOS это создает программное обеспечение macOs для контейнера образов докеров, т. е. его нельзя запускать в качестве контейнера докеров. - person jmg; 02.08.2018
comment
@jmg: я пробовал это только в Linux и не слишком удивлен, что он не работает в OSX, но я не уверен, что именно означает программное обеспечение macOs для создания контейнера образа докера. - person nh2; 06.08.2018
comment
Я имел в виду, что он содержит программное обеспечение, созданное для macOS, а не для Linux. - person jmg; 07.08.2018
comment
@jmg Вот ответ о том, как это сделать в macOS. Суть в том, что вы даете nixpkgs аргумент system: import <nixpkgs> { system = "x86_64-linux"; }. Вам также понадобится удаленный сборщик, работающий под управлением Linux, например linuxkit-nix. - person Hjulle; 03.06.2021