같은 입력이면 같은 출력을 보장하는 빌드 방식. 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 등 언어별 빌더가 이 원칙을 따름.

관련 링크