4P by neo 3달전 | favorite | 댓글 1개

Nix는 Docker의 이미지 빌더보다 낫다

  • Nix는 패키지 관리자, 언어, 운영 체제의 세 가지 측면을 가지고 있음.
  • 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가 있으며, 이 또한 결정론적 패키지 관리와 빌드를 제공함.
Hacker News 의견
  • Nix에 대한 호감을 느끼려고 여러 번 시도했지만, 이제는 포기해야 할 때라고 생각함.

    • Nix를 사용하는 두 시스템이 있지만, 건드리는 것이 두려움.
    • 이론적으로 Nix는 멱등성(idempotent)과 결정론적(deterministic)이지만, 모든 의존성 부분을 정확히 이해하지 않으면 이상한 결과와 도움이 되지 않는 오류를 마주칠 수 있음.
    • 문서화가 매우 형편없으며, 튜토리얼은 일부만 도움이 됨.
    • 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는 대부분의 라이브러리에 대해 상당한 패키징 노력이 필요할 정도로 업스트림과 호환되지 않음.

    • 복잡한 C 또는 C++ 라이브러리의 경우 Nix를 위해 모든 것을 래핑하는 것이 상당한 작업 부분이 됨.
  • 최근에 CI 베이스 이미지를 Nix로 빌드하려고 시도했지만, 이미지가 너무 컸고 링킹 문제로 인해 일부 작업이 제대로 작동하지 않았음.

    • 다중 아키텍처 이미지를 빌드하려면 실제로 다른 아키텍처로 실행하려고 하며, 이는 qemu를 사용한 하드웨어 가상화만 지원함.
  • Dagger를 사용하고 있으며, Docker의 창시자들에 의한 두 번째 시도로 대부분의 문제를 해결함.

    • 이미 사용하고 있는 언어로 파이프라인을 작성할 수 있으며, 레이어 그래프와 고급 캐싱과 같은 BuildKit의 고급 기능을 활용할 수 있음.