Nix é um construtor de imagens Docker melhor do que o construtor de imagens do Docker

Nix vs. Docker como construtores de imagens

  • Compilações baseadas em Nix são elogiadas por um gerenciamento de dependências declarativo e granular, além de uma reprodutibilidade mais rígida do que a de Dockerfiles típicos.
  • Dockerfiles são criticados por não determinismo imperceptível (tags flutuantes, apt-get sem fixação, git clone de branches), embora alguns argumentem que o uso disciplinado de digests, snapshots e mirrors também pode tornar o Docker reproduzível.
  • Vários apontam que o modelo de camadas do Docker é hierárquico e orientado a etapas imperativas de build, enquanto o Nix mapeia um grafo de dependências para camadas, permitindo camadas mais reutilizáveis e endereçadas por conteúdo.

Camadas, snapshotters e ferramentas

  • O limite de 128 camadas do Docker é um problema real ao mapear ingenuamente caminhos do Nix store para camadas; as pessoas usam heurísticas ou agrupamentos, o que prejudica a reutilização de cache.
  • nix-snapshotter integra o Nix com o containerd: containers montam diretamente do Nix store; docker pull se torna substituição do Nix, evitando duplicação de tarballs e o limite de camadas. A implantação é direta em clusters baseados em containerd, mas mais complicada em k8s gerenciado.
  • nix2container e buildLayeredImage do Nix melhoram o cache e os uploads ao registry ao transmitir camadas e armazená-las no cache do Nix, além de permitir que os usuários escolham explicitamente o que vai em cada camada.

Tamanho da imagem e otimização

  • Alguns relatam imagens construídas com Nix inesperadamente grandes (por exemplo, imagens base grandes do Nix, JDKs completos, glibc com todas as localidades).
  • Outros mostram que, com uso cuidadoso de musl, JREs headless, JREs mínimos e overrides para remover recursos não usados, imagens Nix podem ser competitivas ou pequenas; buildLayeredImage permite compartilhar dependências grandes (glibc, JDK) entre muitas imagens.

Experiência do desenvolvedor e complexidade

  • Divisão forte: entusiastas valorizam que um único flake pode descrever builds, dev shells, imagens Docker, módulos NixOS e testes; céticos acham flakess e a linguagem Nix difíceis de aprender, excessivamente abstratas e mal documentadas.
  • Reclamações comuns: erros opacos, “cantos escuros”, curva de aprendizado íngreme para cross-compilation e arquiteturas de flake grandes e customizadas que sobrecarregam iniciantes.
  • São mencionadas várias tentativas de domar a complexidade (padrões de estruturação de flakes, frameworks de mais alto nível, ferramentas como flox), mas o consenso é que a DX continua sendo uma grande barreira.

Preocupações multiplataforma e de ecossistema

  • Usuários de macOS/darwin enfrentam cross-compilation lenta ou frágil, caches Hydra ausentes e integração complicada com Docker; muitos recorrem a builders Linux remotos ou em VM.
  • Guix é citado como uma alternativa funcional semelhante com guix pack -f docker, mas sofre com atualizações de pacotes mais lentas e atrasos na revisão.
  • Para casos de uso simples (por exemplo, serviços em Go/Java), alguns argumentam que construtores de imagens específicos da linguagem (ko, Jib, regras_oci do Bazel) são preferíveis à complexidade do Nix.