私は以前から Nix については耳にしていました。例えば “Nix in 100 Seconds” という動画で簡単な説明などを受けていた。ただ、Nix は少し話を聞いたくらいでは全く理解できず、自分個人にとっての必要性も感じていなかったです。主に macOS を使う自分は Homebrew で満足していました。
それが初めてのインターンで変わりました。インターンでは Docker イメージをルートレス化するプロジェクトに取り組みました。複数のリポジトリで管理されているコードベースの一つ一つに入っているDockerfileを手直ししていき、少し慣れてきたところで Python を使っている大き目のアプリケーションのリポジトリに手をつけました。そこでは Python のライブラリ管理のためについ最近 poetry から uv へと移行していました。
どうもこの uv がルートレスモードとの相性が悪かったです。手元の開発環境ではルートレス化した Dockerfile をビルドして、テストを通すこともできたけどステージング環境で一連の動作を試してみると、ビルドすらできなくなる。シニアエンジニアの方と何時間か一緒に作業した結果、原因は uv がパッケージを最後に同期しようとするところでルート権限が必要になり、ビルドが失敗しているというところまでしか突き止めることができませんでした。恐らくこのイメージをルートレス化するとなると、Dockerfile の書き換えか、uv 本体への改変が必要だったため断念しました。
uv がv1.0.0前のツールであることでまだ充実していないドキュメンテーションから問題を特定することが難しかった。
なぜそもそもこんな問題は起きてしまったのか。どうすれば防げたのか。もっと良い方法はないのか?ここで Nix について思い出しました。ルートレス化したイメージと uv の問題を防げなかったとしても、パッケージ管理についてずっと考えていたら思い出しました。少なくとも再現性の高さや、宣言的であることから、原因究明がもう少し早くなったのではないだろうかと思った。