같은 입력이면 같은 출력을 보장하는 빌드 방식. Nix의 핵심 가치이자 Docker 빌드가 실패하는 지점.
핵심 내용
비결정적 빌드의 실체적 피해 (출처: Nix is a better Docker image builder than Docker’s image builder):
- Docker 빌드는 인터넷에 접근 →
apt-get install의 결과가 시점에 따라 달라짐 - 베이스 이미지 EOL(Ubuntu 18.04 등) 시 과거 빌드를 재현 불가
apt-get upgrade가 만드는 shadow copy로 이미지 크기 비효율- 이 문제는 프로덕션에서 새벽 4시에 발견됨 (전직 SRE 경험담)
결정론적 빌드가 해결하는 것:
- 모든 의존성을 사전 해시 → 동일 입력이면 동일 출력
- 인터넷 접근 없이 빌드 가능 (오프라인 재현성)
- 의존성 트리 분석으로 최소 변경분만 배포
Nix에서의 구현: 모든 패키지 입력이 해시로 추적됨. vendorHash로 외부 의존성까지 고정. pkgs.buildGoModule, pkgs.buildNpmPackage 등 언어별 빌더가 이 원칙을 따름.
관련 링크
- Nix 기반 Docker 이미지 빌드 — 결정론적 빌드의 실전 적용
- Nix flake 패키지 빌드 — flake으로 패키지를 정의하는 패턴