Nix ist besser als der Image-Builder von Docker
- Nix hat drei Aspekte: Paketmanager, Sprache und Betriebssystem.
- Das Erstellen von Docker-Images mit Nix hat Vorteile gegenüber dem Image-Builder von Docker selbst.
- Nix macht es möglich, alle im Build-Prozess benötigten Abhängigkeiten im Voraus zu kennen, und erlaubt Builds auch ohne Internetverbindung.
Vorteile von Nix
- Mit Nix lassen sich Docker-Images effizienter erstellen.
- Nix teilt Abhängigkeiten in möglichst wenige Docker-Layer auf, sodass bei Updates nur minimale Änderungen übernommen werden.
- Wenn mehrere Services dasselbe Repository verwenden, können sie Docker-Layer gemeinsam nutzen, was effizient ist.
Beispiel eines Douglas-Adams-Zitat-Service
- Es wird erklärt, wie ein Go-Programm mit Nix paketiert und in ein Docker-Image umgewandelt wird.
- Mit der Funktion
dockerTools.buildLayeredImage kann ein Layered Image erstellt werden.
- Das Ergebnis ist ein gewöhnliches Container-Image, das überall bereitgestellt werden kann.
Meinung von GN⁺
- Der Einsatz von Nix kann die Verwaltung von Abhängigkeiten und die Reproduzierbarkeit von Builds im Softwareentwicklungsprozess erheblich verbessern.
- Im Vergleich zu Docker kann Nix durch die deterministischen Eigenschaften seiner Builds langfristig Zeit und Ressourcen sparen.
- Allerdings können die neuen Konzepte und die Bedienung von Nix für Einsteiger etwas schwierig sein, und auch die Integration in bestehende CI/CD-Pipelines kann herausfordernd sein.
- Bei der Einführung dieser Technik sind Schulung im Team und eine Eingewöhnungszeit nötig; außerdem sollte die Kompatibilität mit der bestehenden Infrastruktur berücksichtigt werden.
- Ein anderes Tool mit ähnlichen Funktionen wie Nix ist Guix, das ebenfalls deterministische Paketverwaltung und Builds bietet.
1 Kommentare
Hacker-News-Kommentare
Ich habe mehrfach versucht, Sympathie für Nix zu entwickeln, aber ich denke, es ist an der Zeit, aufzugeben.
Nix und NixOS befinden sich in einem ähnlichen Zustand wie git vor GitHub.
Ich habe 2–3 Tage damit verbracht, auf Darwin Docker-Images zu bauen, und dieser Artikel fühlt sich an, als würde er mich verspotten.
Im Blogpost fehlt eine Erklärung, warum gemeinsam genutzte Docker-Layer nützlich sind.
Die Erfahrung, Docker-Images für Java-Anwendungen mit Nix zu bauen, war nicht besonders angenehm.
Es ist nützlich, wenn man Nix bereits eingeführt hat, und ich hoffe, dass deklarativere Paketmanagement-Lösungen wie Nix oder Guix populärer werden.
Als Platform Engineer würde ich Nix gern mögen, aber es ist nicht für alle einfach.
devbox add python@3.11hinzuzufügen.Nix ist mit Upstream für die meisten Bibliotheken so inkompatibel, dass erheblicher Paketierungsaufwand nötig ist.
Kürzlich habe ich versucht, ein CI-Basis-Image mit Nix zu bauen, aber das Image war zu groß, und wegen Linking-Problemen funktionierten einige Jobs nicht richtig.
Ich nutze Dagger, und als zweiter Versuch der Docker-Gründer löst es die meisten Probleme.