4 ポイント 投稿者 GN⁺ 2024-03-17 | 1件のコメント | WhatsAppで共有

NixはDockerのイメージビルダーより優れている

  • Nixには、パッケージマネージャー、言語、オペレーティングシステムという3つの側面がある。
  • Nixを使ってDockerイメージを作ることには、Docker自体のイメージビルダーより優れている点がある。
  • Nixはビルド過程で必要なすべての依存関係を事前に把握でき、インターネット接続なしでもビルド可能にする。

Nixの利点

  • Nixを使うと、Dockerイメージをより効率的に作成できる。
  • Nixは最小限のDockerレイヤーで依存関係を分割し、更新時にも最小限の変更だけを反映する。
  • 複数のサービスが同じリポジトリにある場合、Dockerレイヤーを相互に共有できるため効率的である。

Douglas Adamsの引用サービスの例

  • GoプログラムをNixでパッケージ化し、Dockerイメージへ変換する過程を説明している。
  • dockerTools.buildLayeredImage 関数を使ってレイヤードイメージを作成できる。
  • 結果として一般的なコンテナイメージが得られ、これをどこにでもデプロイできる。

GN⁺の見解

  • Nixを使うことは、ソフトウェア開発過程における依存関係管理とビルドの再現性を大きく向上させる方法となりうる。
  • Dockerと比べると、Nixはビルドの決定論的な特性により、長期的には時間とリソースを節約できる。
  • ただし、Nixの新しい概念や使い方は初心者にはやや難しく、既存のCI/CDパイプラインへ統合する際に苦労する可能性がある。
  • この技術を導入する際には、チーム内での教育と適応期間が必要であり、既存インフラとの互換性も考慮する必要がある。
  • Nixと似た機能を提供する別のツールとしてGuixがあり、こちらも決定論的なパッケージ管理とビルドを提供する。

1件のコメント

 
GN⁺ 2024-03-17
Hacker Newsの意見
  • Nixに好感を持とうと何度も試みたが、もう諦めるべき時だと思う。

    • Nixを使っているシステムが2つあるが、触るのが怖い。
    • 理論上、Nixは冪等的で決定論的だが、依存関係のあらゆる部分を正確に理解していないと、奇妙な結果や役に立たないエラーに直面することがある。
    • ドキュメントは非常にひどく、チュートリアルも一部しか役に立たない。
    • Dockerの強みは混沌そのものにあり、シェルとパッケージマネージャーの基本的な理解だけで、ほとんど何でも簡単に構築できる。
  • NixとNixOSは、GitHub以前のgitに似た状態にある。

    • 基本的なアイデアは、現在のSVNやDockerよりもさらに本格的なコンピュータサイエンスに基づいている。
    • floxのリリースで状況が変わった可能性があり、floxは使いやすい。
    • flakesとnix-commandなしではNixに意味はなく、これらは実験的でデフォルトでは無効になっている。
    • Nix/NixOSまたはそれに類するものがDockerを同じ状態にするだろうが、GitHubの瞬間が来るまではそうならないだろう。
  • DarwinでDockerイメージをビルドするのに2〜3日費やしたが、この記事は自分をあざ笑っているように感じる。

    • Nixはやりたいことを実現するための最高のツールだが、ときどき魂をすり減らすような暗い一面がある。
  • 共有Dockerレイヤーが有用である理由の説明がブログ記事から抜けている。

    • キャッシュのために有用だ。より多くのイメージが同じレイヤーを共有するほど、キャッシュの効きがよくなる。
    • Nixはすでにハッシュによって依存関係を保存しているため、レイヤーは常に同じバージョンと構成で同一になる。
  • Javaアプリケーション向けのDockerイメージをNixでビルドした経験は、あまり楽しいものではなかった。

    • gradle2nixが廃止された後、GradleベースのJavaアプリケーション向けDockerイメージをビルドする明確な代替手段がない。
  • すでにNixを採用している場合には有用であり、NixやGuixのような、より宣言的なパッケージ管理ソリューションが普及してほしい。

    • Dockerを使いながら段階的にNixを導入したいなら、Dockerfileを維持しつつNix構成をビルドする代替アプローチがある。
  • プラットフォームエンジニアとしてNixを気に入りたいが、誰にとっても簡単ではない。

    • たとえば、devbox add python@3.11のようにパッケージを追加するほうが好みだ。
  • Nixは大半のライブラリに対してかなりのパッケージング作業を必要とするほど、upstreamと互換性がない。

    • 複雑なCまたはC++ライブラリの場合、Nix向けにすべてをラップすることが作業のかなりの部分を占める。
  • 最近CIベースイメージをNixでビルドしようとしたが、イメージが大きすぎ、リンクの問題のせいで一部のジョブが正しく動かなかった。

    • マルチアーキテクチャイメージをビルドするには、実際に別のアーキテクチャで実行しようとすることになり、これはqemuを使ったハードウェア仮想化しかサポートしていない。
  • Daggerを使っており、Dockerの創業者たちによる2度目の試みとして、問題の大半を解決している。

    • すでに使っている言語でパイプラインを書けるほか、レイヤーグラフや高度なキャッシュなど、BuildKitの高度な機能を活用できる。