- Ya están disponibles imágenes de Docker de Arch Linux con reproducibilidad bit por bit, extendiendo a Docker el mismo hito que se logró hace unos meses con las imágenes de WSL
- Las imágenes se distribuyen con una etiqueta dedicada,
repro, y para garantizar la reproducibilidad se eliminan las claves de pacman, por lo quepacmanno puede usarse de inmediato en el estado predeterminado - Para instalar o actualizar paquetes dentro del contenedor, es necesario regenerar el keyring; se puede inicializar con
pacman-key --init && pacman-key --populate archlinux - La reproducibilidad se verifica mediante la coincidencia del digest entre compilaciones y con comparaciones usando
diffoci; además, se aplicaron ajustes como compilaciones determinísticas del rootFS, normalización de marcas de tiempo y eliminación de la caché auxiliar deldconfig - El procedimiento de reproducción puede consultarse en
REPRO.md, y a futuro podría ampliarse con servidores rebuilder para recompilación y verificación automáticas, además de la publicación de logs y resultados de compilación
Contenido clave
- La imagen de Docker de Arch Linux ahora se ofrece en una forma reproducible bit por bit, extendiendo al lado de Docker el mismo hito que se alcanzó hace unos meses con la imagen de WSL
- Esta imagen se distribuye con la etiqueta dedicada
reproy, para garantizar la reproducibilidad, fue necesario eliminar las claves de pacman de la imagen, por lo quepacmanno puede usarse inmediatamente- Hasta que exista una solución adecuada, esta limitación hace que por ahora se ofrezca como una etiqueta separada
- Para instalar o actualizar paquetes dentro del contenedor, primero hay que ejecutar
pacman-key --init && pacman-key --populate archlinuxpara regenerar el keyring- En la primera ejecución puede hacerse de forma interactiva, o ejecutarse en una instrucción
RUNde un Dockerfile que use esta imagen como base - En Distrobox, puede manejarse con un pre-init hook como este:
distrobox create -n arch-repro -i docker.io/archlinux/archlinux:repro --pre-init-hooks "pacman-key --init && pacman-key --populate archlinux"
- En la primera ejecución puede hacerse de forma interactiva, o ejecutarse en una instrucción
- La reproducibilidad bit por bit de la imagen se confirma mediante la coincidencia del digest entre compilaciones, y se verifica con
podman inspect --format '{{.Digest}}' <image>y comparaciones condiffoci - Cómo reproducir esta imagen de Docker puede consultarse en
REPRO.md
Implementación y ajustes
- El mayor desafío fue compilar de forma determinística el rootFS base para la imagen de Docker, y se reutilizó el mismo proceso que en la imagen de WSL, que comparte el sistema de compilación del rootFS
- El commit relacionado de WSL puede verse aquí
- Entre los ajustes específicos para Docker, uno fue configurar
SOURCE_DATE_EPOCHy hacer que la LABELorg.opencontainers.image.createddel Dockerfile también siguiera ese valor - En la imagen compilada se eliminó, en la etapa del Dockerfile, el archivo de caché auxiliar de
ldconfig,var/cache/ldconfig/aux-cache, que provocaba no determinismo - Al usar
docker buildopodman build, se aplica normalización de marcas de tiempo con las opciones--source-date-epoch=$SOURCE_DATE_EPOCHy--rewrite-timestamp- Como ejemplo, se mostraba el problema de que las horas de
etc/,etc/ld.so.cache,etc/os-release,sys/,var/cache/,var/cache/ldconfig/,proc/ydev/quedaban registradas de forma distinta
- Como ejemplo, se mostraba el problema de que las horas de
- Todos los cambios relacionados pueden revisarse con más detalle en el diff del merge request del repositorio
archlinux-docker - Como siguiente paso, se está considerando construir en un servidor un rebuilder para la imagen de Docker, la imagen de WSL y futuras imágenes reproducibles, con el fin de realizar recompilaciones automáticas periódicas, verificar la reproducibilidad y publicar logs y resultados de compilación
1 comentarios
Comentarios de Hacker News
Da gusto ver este nivel de confianza
Corrí Arch Linux en WSL 2 durante casi un año y me fue excelente, y después usé Arch nativo por unos 5 meses y también quedé muy satisfecho
Sigo usando Arch nativo ahora mismo, y pruebo mis dotfiles con una imagen Docker de Arch sobre un sistema de archivos limpio
Cuando necesito pruebas de extremo a extremo que incluso monten un entorno de escritorio completo, corro Arch en una VM
Tengo muchos problemas, pero al menos Arch no es uno de ellos
Justo estaba buscando una configuración de dotfiles nivel enterprise con métricas de Prometheus y health probes, y esto suena exactamente a eso
Ni siquiera había pensado que necesitaba esto, pero en cuanto lo vi, lo necesité
Si sí, me gustaría escuchar qué te parecieron
Creo que todos los contenedores Docker debieron haber sido así desde el principio
Ejecutar
apt-get updateen la etapa de docker build es casi un antipatrónLo he usado yo mismo y funcionó bastante bien
Si no actualizas, se te acumulan problemas de seguridad conocidos en el contenedor, y si actualizas, se rompe la reproducibilidad
La reproducibilidad sin duda es genial y también tiene ventajas de seguridad, pero una vez que el contenedor pasa del mes puede empezar a sentirse como un objetivo equivocado, y quizá una vida útil máxima medida en días sea más apropiada
Me pregunto si la idea es bajar código fuente etiquetado y compilarlo todo uno mismo con gcc
Los contenedores reproducibles son algo bueno, sí, pero no siempre son necesarios, y hay bastantes casos en los que puedes ejecutar
apt-getdentro del contenedor sin preocuparte por la reproducibilidadClaro, siempre queda la opción de sacarlas del archivo histórico
Las imágenes reproducibles muchas veces parecen una función que solo da satisfacción emocional en el día a día, pero llega el día en que de verdad la necesitas
A nosotros nos pasó que dos imágenes que debían ser idénticas terminaron con una diferencia de 3 bytes en el timestamp entre máquinas distintas, y por eso perdimos toda una tarde haciendo bisect en la dirección equivocada
No es algo vistoso, pero definitivamente fue una victoria valiosa
Seguro podría meter algo para que todo el mundo se entere de que uso Arch en mi pipeline de CI/CD
Supongo que también junto con el dato de que hago Crossfit
Si te encuentras con un vegano que hace CrossFit y además es usuario de Arch, ¿qué es lo primero que te va a decir?
Aquí pueden ver información sobre Reproducible Builds
https://reproducible-builds.org/
Y la comunidad estrechamente relacionada de Bootstrappable Builds está aquí
https://bootstrappable.org/
Me pregunto si sistemas como Arch o Alpine, que son sistemas operativos mutables bien diseñados, podrían terminar superando a largo plazo a algo como NixOS
Porque los scripts de instalación son más expresivos que un lenguaje de configuración declarativa, y por lo general tampoco son más verbosos
Tienes un lenguaje de configuración declarativa, y al mismo tiempo un lenguaje de programación completo de Turing y cómodo de escribir
Leí el artículo y se ve bastante bien, pero da la impresión de que mezcla Dockerfile con docker image
Creo que habría sido más fácil construir directamente el archivo tar de la imagen con algo como nix en vez de usar Dockerfile; claro, sería un poco más de nicho, pero también habría quedado más limpio
Como detalle menor, creo que sería más correcto usar el término OCI Image
También funciona perfectamente en podman
Mi enorme respeto para quienes hicieron esto realmente posible
El tiempo y esfuerzo que se necesita para lograr un titular como este es mucho mayor de lo que uno imagina
Es un tema totalmente aparte, pero esa página tiene una animación donde, durante 1 segundo, casi todos los elementos bajan unos 20 píxeles
Viendo el layout moverse frente a mis ojos, pensé que iba a destrozar el CLS, pero el CLS real era 0
Entonces me hizo preguntarme si CLS será una métrica engañosa
CLS se ocupa de cambios durante el renderizado inicial, así que aunque parezca un desplazamiento del layout, no es del tipo que cuenta para CLS
Es movimiento causado por una CSS transition, un cambio predecible, y por eso no se cuenta como layout shift