4 puntos por GN⁺ 2024-03-17 | 1 comentarios | Compartir por WhatsApp

Nix es mejor que el constructor de imágenes de Docker

  • Nix tiene tres facetas: gestor de paquetes, lenguaje y sistema operativo.
  • Crear imágenes Docker con Nix tiene ventajas frente al constructor de imágenes de Docker.
  • Nix permite conocer de antemano todas las dependencias necesarias en el proceso de compilación y hace posible compilar incluso sin conexión a Internet.

Ventajas de Nix

  • Con Nix se pueden crear imágenes Docker de manera más eficiente.
  • Nix divide las dependencias en el mínimo de capas Docker posible, reflejando solo los cambios mínimos cuando hay actualizaciones.
  • Si varios servicios están en el mismo repositorio, pueden compartir entre sí las capas Docker, lo que mejora la eficiencia.

Ejemplo de un servicio de citas de Douglas Adams

  • Se explica el proceso de empaquetar un programa en Go con Nix y convertirlo en una imagen Docker.
  • Se puede crear una imagen en capas usando la función dockerTools.buildLayeredImage.
  • Como resultado, se obtiene una imagen de contenedor convencional que puede desplegarse en cualquier lugar.

Opinión de GN⁺

  • Usar Nix puede mejorar enormemente la gestión de dependencias y la reproducibilidad de las compilaciones en el proceso de desarrollo de software.
  • En comparación con Docker, Nix puede ahorrar tiempo y recursos a largo plazo gracias a la naturaleza determinista de sus compilaciones.
  • Sin embargo, los nuevos conceptos y la forma de uso de Nix pueden resultar algo difíciles para principiantes, y puede haber dificultades al integrarlo en pipelines de CI/CD existentes.
  • Al adoptar esta tecnología, se necesita capacitación dentro del equipo y un período de adaptación, además de considerar la compatibilidad con la infraestructura existente.
  • Otra herramienta con funciones similares a Nix es Guix, que también ofrece gestión de paquetes y compilaciones deterministas.

1 comentarios

 
GN⁺ 2024-03-17
Comentarios de Hacker News
  • He intentado varias veces tomarle cariño a Nix, pero creo que ya es momento de rendirme.

    • Tengo dos sistemas que usan Nix, pero me da miedo tocarlos.
    • En teoría, Nix es idempotente y determinista, pero si no entiendes con precisión toda la parte de dependencias, puedes terminar con resultados extraños y errores que no ayudan.
    • La documentación es muy mala y los tutoriales solo ayudan en parte.
    • La fortaleza de Docker está en el propio caos: con una comprensión básica del shell y del gestor de paquetes, puedes construir casi cualquier cosa con facilidad.
  • Nix y NixOS están en un estado parecido al de git antes de GitHub.

    • La idea base se apoya en una informática más seria que la de SVN o Docker actuales.
    • Puede que el lanzamiento de flox haya cambiado algo las cosas, y flox es fácil de usar.
    • Sin flakes y nix-command, Nix no tiene mucho sentido, pero estos son experimentales y están desactivados por defecto.
    • Nix/NixOS o algo parecido pondrá a Docker en esa misma situación, pero no será así hasta que llegue su momento GitHub.
  • Pasé 2 o 3 días intentando construir imágenes Docker en Darwin, y este artículo se siente como si se estuviera burlando de mí.

    • Nix es la mejor herramienta para lograr lo que quieres, pero a veces tiene rincones oscuros que te secan el alma.
  • En la entrada del blog falta una explicación de por qué son útiles las capas compartidas de Docker.

    • Son útiles por el caché. Mientras más imágenes compartan la misma capa, mejor funciona el caché.
    • Nix ya almacena las dependencias mediante hashes, así que las capas siempre son iguales con la misma versión y configuración.
  • La experiencia de construir imágenes Docker para aplicaciones Java con Nix no fue muy agradable.

    • Después de que gradle2nix quedó discontinuado, no hay una alternativa clara para construir imágenes Docker de aplicaciones Java basadas en Gradle.
  • Es útil si ya adoptaste Nix, y ojalá soluciones de gestión de paquetes más declarativas como Nix o Guix se vuelvan masivas.

    • Si quieres adoptar Nix de forma gradual mientras usas Docker, existe un enfoque alternativo que mantiene el Dockerfile y construye la configuración de Nix.
  • Como platform engineer, quiero que me guste Nix, pero no es fácil para todo el mundo.

    • Por ejemplo, prefiero agregar paquetes como devbox add python@3.11.
  • Nix no es compatible con upstream hasta el punto de que requiere bastante esfuerzo de empaquetado para la mayoría de las bibliotecas.

    • En el caso de bibliotecas complejas de C o C++, envolver todo para Nix termina siendo una parte considerable del trabajo.
  • Hace poco intenté construir una imagen base de CI con Nix, pero la imagen quedó demasiado grande y algunos trabajos no funcionaban bien por problemas de linking.

    • Para construir imágenes multiarquitectura, en realidad intenta ejecutarlas en la otra arquitectura, y eso solo soporta virtualización de hardware usando qemu.
  • Estoy usando Dagger, y resuelve la mayoría de los problemas como un segundo intento de los creadores de Docker.

    • Puedes escribir pipelines en el lenguaje que ya usas y aprovechar funciones avanzadas de BuildKit, como el grafo de capas y el caché avanzado.