quinta-feira, 25 de junho de 2026

Cargo, Nix e Docker (em Rust)

O Papel de Cada Ferramenta

[Cargo]: É o gerenciador de pacotes e sistema de compilação oficial e exclusivo do Rust. Ele lida com a busca de dependências (crates), compilação do seu código, execução de testes e publicação.

[Nix]: É um gerenciador de pacotes universal e isolado (baseado em linguagem funcional). Ele lida com o ambiente de desenvolvimento completo (incluindo versões do compilador, ferramentas como rust-analyzer e dependências externas do sistema operacional).

Em vez de substituir o Cargo, o Nix é frequentemente usado em conjunto com ele para:

- Garantir reprodutibilidade: O Nix cria um ambiente fechado onde a sua versão exata do Rust, Cargo e bibliotecas em C (como openssl) são fixadas, garantindo que o projeto compile igual em qualquer computador.

- Empacotamento: O recurso buildRustPackage do Nix usa o próprio Cargo.lock para empacotar o software para distribuição no sistema operacional.


Nix e Docker

O senso comum diz que o Nix e o Docker concorrem entre si, mas na verdade eles resolvem problemas diferentes e funcionam muito bem juntos.

Enquanto o Docker cuida de como o software roda (isolamento de processos e deployment), o Nix cuida de como o software é construído (gerenciamento e reprodutibilidade de dependências).Se o seu projeto já está em Docker, o Nix resolve três problemas crônicos do ecossistema de contêineres:

1. O Nix constrói Imagens Docker melhores que o próprio Docker

Criar um Dockerfile otimizado e seguro exige malabarismos com builds multi-estágio (multi-stage builds), limpeza de cache do apt/alpine e remoção de compiladores de produção. 

Com o Nix (dockerTools): O Nix analisa a árvore de dependências do seu projeto Rust e cria uma imagem contendo exclusivamente o seu binário compilado e as bibliotecas estritamente necessárias para ele rodar. O resultado é uma imagem extremamente leve (estilo distroless ou scratch) sem que você precise escrever nenhuma linha de comando de terminal no Dockerfile.

2. Cache inteligente de Camadas (Layers)

No Docker tradicional, se você altera uma linha de código, o Docker costuma invalidar o cache daquela linha em diante, forçando re-downloads ou passos lentos de compilação.

O Nix entende o grafo de dependências exato do seu projeto. Ao gerar uma imagem Docker via Nix, ele quebra a imagem em várias camadas automaticamente baseando-se nas bibliotecas. Se você atualizar o seu código Rust, apenas a camada minúscula do seu binário é alterada; todas as camadas de dependências do sistema e do Rust permanecem intocadas no cache.

3. Fim do "Apt-get update" que quebra o build no CI

Imagens base do Docker (como ubuntu:latest ou debian-slim) mudam com o tempo. Um comando apt-get update && apt-get install -y libssl-dev dentro de um Dockerfile pode baixar uma versão ligeiramente diferente hoje em comparação com o mês passado, quebrando o seu build misteriosamente no servidor de CI.

O Nix elimina o acesso à rede durante a compilação. Ele garante um ambiente 100% determinístico. O build da sua imagem Docker vai gerar o mesmo hash binário exato, não importa se foi compilado hoje ou daqui a cinco anos.


Resumo da ópera

Você não joga o Docker fora. Você passa a usar o Nix como a ferramenta que gera o arquivo .tar da sua imagem Docker. Depois, você faz o docker load e sobe o contêiner normalmente na nuvem ou no seu Kubernetes.

Postagens mais visitadas

Postagem em destaque

Cargo, Nix e Docker (em Rust)

O Papel de Cada Ferramenta [Cargo]: É o gerenciador de pacotes e sistema de compilação oficial e exclusivo do Rust. Ele lida com a busca de ...