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-getsem fixação,git clonede 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-snapshotterintegra o Nix com o containerd: containers montam diretamente do Nix store;docker pullse 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.nix2containerebuildLayeredImagedo 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;
buildLayeredImagepermite 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.