Dev Containers vs Nix: 再現可能な環境
どちらも再現可能な環境を提供しますが、方法が異なります。Dev Containers は devcontainer.json を介して Docker イメージと tooling を固定します。Nix はビットレベルの再現性のためにすべてのパッケージを正確な hash に固定しますが、学習曲線はより急です。
Dev Containers と Nix はどちらも環境の drift に対抗し、同じ toolchain がすべてのラップトップと CI で動作するようにします。Dev Containers はエディタとツールの設定とともに container をラップし、Nix は正確でハーメティックなビルドを行う純粋関数型のパッケージマネージャーです。以下が率直な比較です。
| Dev Containers | Nix | |
|---|---|---|
| アプローチ | container イメージ + devcontainer.json | 関数型パッケージマネージャー (flakes) |
| 再現性 | 強い (固定されたイメージ + features) | 非常に強い (hash 固定、ハーメティック) |
| 学習曲線 | 低い (馴染みのある Docker) | 高い (Nix 言語 + 概念) |
| エディタ統合 | VS Code、Codespaces でファーストクラス | エディタ非依存 |
| 粒度 | 環境全体を 1 つのイメージとして | パッケージ単位、コンポーザブル |
| CI での利用 | 同じイメージを再利用 | nix develop / ハーメティックなビルド |
馴染み vs ハーメティック
Dev Containers はチームがすでに持っている container の知識を再利用します。devcontainer.json をイメージに向け、features を追加すれば、全員が同じ環境を得られ、VS Code と Codespaces との統合も優れています。Nix は保証の面でさらに踏み込み、すべての依存関係を content hash に固定してビルドをハーメティックにし、バージョンレベルまで再現可能にしますが、Nix 言語とメンタルモデルの習得には実際の時間がかかります。
再現性のトレードオフ
Dev Container はそのベースイメージと内部でロック可能な依存関係と同程度に再現可能です。導入は容易ですが、イメージが緩く再構築されると drift する可能性があります。Nix の flakes は input を正確にロックするため、同じ commit が数年後も同じ環境を生成します。その代償は、より急な onramp と、それに慣れているエンジニアのプールが小さいことです。
CI では
どちらも「私のマシンでは動く」という失敗を取り除きます。Dev Containers では CI が使うのと同じイメージをビルドして実行できます。Nix ではハーメティックなビルドと共有可能な binary cache が得られ、runner は再構築する代わりに事前構築された derivations を取得します。
結論
チームがすでに理解している、摩擦が少なくエディタ統合された再現可能な環境が欲しいなら Dev Containers を、hash レベルの最大限の再現性が必要で学習曲線に投資できるなら Nix を選びましょう。両方を組み合わせるチームもあります。