¿Debo usar Dockerfiles o confirmaciones de imágenes?

81

Estoy un poco confundido acerca de estas dos opciones. Parecen estar relacionados. Sin embargo, no son realmente compatibles.

Por ejemplo, parece que usar Dockerfiles significa que realmente no debería comprometerse con las imágenes, porque realmente debería rastrear el Dockerfile en git y hacer cambios en eso. Entonces no hay ambigüedad sobre lo que es autorizado.

Sin embargo, las confirmaciones de imágenes parecen realmente agradables. Es tan bueno que podría modificar un contenedor directamente y etiquetar los cambios para crear otra imagen. Entiendo que incluso puede obtener algo como un sistema de archivos diferente de un historial de confirmación de imagen. Increíble. Pero entonces no deberías usar Dockerfiles. De lo contrario, si realizó una confirmación de imagen, tendría que volver a su Dockerfile y realizar algún cambio que represente lo que hizo.

Así que estoy desgarrado. Me encanta la idea de las confirmaciones de imágenes: que no tienes que representar el estado de tu imagen en un Dockerfile, simplemente puedes rastrearlo directamente. Pero me preocupa renunciar a la idea de algún tipo de archivo de manifiesto que le brinde una descripción general rápida de lo que hay en una imagen. También es desconcertante ver dos funciones en el mismo paquete de software que parecen ser incompatibles.

¿Alguien tiene alguna idea sobre esto? ¿Se considera una mala práctica utilizar confirmaciones de imágenes? ¿O debería simplemente soltar mi archivo adjunto para manifestar archivos de mis días de Puppet? ¿Qué tengo que hacer?

Actualización :

Para todos aquellos que piensan que esta es una pregunta basada en opiniones, no estoy tan seguro. Tiene algunas cualidades subjetivas, pero creo que es principalmente una pregunta objetiva. Además, creo que una buena discusión sobre este tema será informativa.

Al final, espero que cualquiera que lea esta publicación comprenderá mejor cómo los archivos Dockerfiles y las confirmaciones de imágenes se relacionan entre sí.

Actualización - 2017/7/18 :

Recientemente descubrí un uso legítimo para las confirmaciones de imágenes. Acabamos de configurar una canalización de CI en nuestra empresa y, durante una etapa de la canalización, nuestras pruebas de aplicaciones se ejecutan dentro de un contenedor. Necesitamos recuperar los resultados de cobertura del contenedor salido después de que el proceso de ejecución de prueba los haya generado (en el sistema de archivos del contenedor) y el contenedor haya dejado de ejecutarse. Usamos confirmaciones de imagen para hacer esto confirmando el contenedor detenido para crear una nueva imagen y luego ejecutando comandos que muestran y vuelcan el archivo de cobertura a stdout. Así que es útil tener esto. Aparte de este caso muy específico, utilizamos Dockerfiles para definir nuestros entornos.

David Sanders
fuente
2
Hay mucha filosofía aquí, y las filosofías de las personas difieren, lo que hace que esta sea quizás una mala pregunta para SO. Sin embargo, mi propia filosofía: siempre quieres saber exactamente cómo reproducir una imagen determinada y estar seguro de que puedes hacerlo. Usando imágenes doradas, es muy, muy fácil no saber cómo alguien pasó del estado A al estado B, mientras que con la automatización que impulsa el proceso de construcción, no hay forma de olvidar. Entonces, personalmente, sí, llamo a Dockerfiles lo correcto, y la imagen comete (como cualquier tipo de imagen dorada que se basa en la intervención manual para construir) el mal. Pero ese soy yo y YMMV.
Charles Duffy
@CharlesDuffy ¿Dónde debería ir esta pregunta si no pertenece a SO?
David Sanders
1
@CharlesDuffy Por cierto, no estoy de acuerdo con que esta sea una pregunta basada en opiniones. Debería haber una respuesta correcta aquí, si no una respuesta correcta que depende de un poco más de contexto. Para su información, voté para mover mi pregunta a Serverfault.
David Sanders
2
...*encogimiento de hombros*. Puedo citar razones concretas de mi preferencia, pero ¿eso las hace más correctas que las razones concretas que otra persona cita para las suyas? He trabajado con personas que son fanáticas del enfoque de la imagen dorada, y no siempre es posible convencer a alguien citando hechos, porque las partes pueden valorar diferentes características en una solución en diferentes grados, por lo que es completamente posible estar de acuerdo con los hechos. pero no estoy de acuerdo con las conclusiones. Cuál es el sello distintivo de una pregunta basada en la opinión, y lo que espero ver si realmente tenemos fanáticos de la imagen dorada que aparecen aquí.
Charles Duffy
1
Me he estado preguntando lo mismo, y mi impresión (que podría ser totalmente incorrecta) es que en realidad es el mismo caso que con vms -> no quieres saber cómo recrear la imagen de vm. En mi caso, tengo scripts .sh regulares para instalar, y me pregunto por qué no puedo simplemente mantenerlos, ejecutar Docker y llamarlos de manera efectiva, y crear la imagen de la versión dorada de esa manera. Mis scripts funcionan para instalarlo en una computadora local, y la razón por la que quiero usar Docker es para lidiar con conflictos de múltiples instancias de programas / tener un sistema de archivos limpio / etc
Bradford Medeiros

Respuestas:

47

Los Dockerfiles son una herramienta que se utiliza para crear imágenes.

El resultado de la ejecución docker build .es una imagen con una confirmación, por lo que no es posible utilizar un Dockerfile sin crear una confirmación . La pregunta es ¿debería actualizar la imagen a mano cada vez que algo cambia y, por lo tanto, condenarse a la maldición de la imagen dorada ?

La maldición de la imagen dorada es una terrible maldición lanzada sobre las personas que deben seguir viviendo con una imagen base con un agujero de seguridad con errores en la que ejecutar su software porque la persona que la creó fue devorada hace mucho tiempo por los antiguos (o se mudó a un nuevo trabajo) y nadie sabe de dónde sacaron la versión de imagemagic que incluía esa imagen. y es lo único que se vinculará con el módulo c ++ que fue proporcionado por ese consultor que el hijo del jefe contrató hace tres años, y de todos modos no importa porque incluso si averiguaste de dónde vino imagemagic de la versión de libstdc ++ utilizada por el JNI llama a la herramienta de soporte que hace prácticas con el cabello largo creado solo existe en una versión no compatible de ubuntu de todos modos.

Arthur Ulfeldt
fuente
3
En realidad, esto me parece el meollo del problema. Si usa confirmaciones de imagen exclusivamente, está atascado con su imagen base. Podría hacer una actualización de la imagen, pero eso suena como una pesadilla. Parece mucho más preferible tener ese tipo de información presentada limpiamente en un Dockerfile. Creo que Docker no debería haber expuesto las confirmaciones de imágenes como parte de su API pública. Simplemente no parece haber ningún uso legítimo para ellos que no sea con fines ilustrativos en la documentación introductoria.
David Sanders
7
No solo inventé ese ejemplo ... :-(
Arthur Ulfeldt
22

Conocer las ventajas e inconvenientes de las soluciones es un buen comienzo. Porque una combinación de los dos es probablemente una forma válida de hacerlo.

Con: evitar el callejón sin salida de la imagen dorada :

Usar solo confirmaciones es malo si pierde la noción de cómo reconstruir su imagen. No desea estar en el estado en que no puede reconstruir la imagen . Este estado final se denomina aquí imagen dorada, ya que la imagen será su única referencia, punto de inicio y punto final en cada etapa. Si lo pierde, tendrá muchos problemas, ya que no podrá reconstruirlo. El callejón sin salida fatal es que un día necesitará reconstruir uno nuevo (porque todas las bibliotecas del sistema son obsoletas, por ejemplo), y no tendrá idea de qué instalar ... terminando en una gran pérdida de tiempo.

Como nota al margen , es probable que usar confirmaciones sobre confirmaciones sería mejor si el registro del historial fuera fácil de usar (consulte las diferencias y repítalas en otras imágenes) como está en git: notará que git no tiene este dilema.

Pro: mejoras ingeniosas para distribuir

Por otro lado, las confirmaciones de capas tienen una ventaja considerable en términos de actualizaciones distribuidas y, por lo tanto, en ancho de banda y tiempo de implementación. Si comienza a manejar imágenes de la ventana acoplable cuando un panadero está manejando panqueques (que es precisamente lo que permite la ventana acoplable), o si desea implementar la versión de prueba al instante, estará más feliz de enviar solo una pequeña actualización en forma de una pequeña confirmación en lugar de una imagen completamente nueva. Especialmente cuando tiene una integración continua para sus clientes donde las correcciones de errores deben implementarse pronto y con frecuencia.

Intenta sacar lo mejor de dos mundos:

En este tipo de escenario, probablemente desee etiquetar la versión principal de sus imágenes y deberían provenir de Dockerfiles. Y puede proporcionar versiones de integración continua gracias a las confirmaciones basadas en la versión etiquetada. Esto mitiga las ventajas e inconvenientes de los Dockerfiles y el escenario de confirmaciones de capas. Aquí, el punto clave es que nunca dejas de hacer un seguimiento de tus imágenes al limitar la cantidad de confirmaciones que permitirás hacer en ellas.

Así que supongo que depende de tu escenario, y probablemente no deberías intentar encontrar una sola regla. Sin embargo, puede haber algunos callejones sin salida reales que realmente debería evitar (como terminar con un escenario de "imagen dorada") cualquiera que sea la solución.

vaab
fuente
¿No reconstruye Docker las imágenes de manera inteligente de modo que no necesite desplegar una imagen completamente nueva para implementar después de haber reconstruido a partir de un Dockerfile modificado?
David Sanders
1
@DavidSanders No terminarás descargando imágenes completamente nuevas, tienes razón en esto. Pero cualquier instrucción temprana cuyos resultados cambien invalidará todas las capas siguientes. Es notorio que 'ADD' o cualquier instrucción de dependencia son a menudo instrucciones que puede hacer al final con una única confirmación nueva, pero si reconstruye su Dockerfile, generará capas completamente nuevas. Se han realizado algunos esfuerzos en torno a 'ADD' para ser más inteligente github.com/docker/docker/issues/880 , ver también, siguiendo preocupaciones similares jpetazzo.github.io/2013/12/01/docker-python-pip-requirements
vaab