En este artículo continuamos nuestra serie de Docker y nos metemos de lleno en algunos conceptos fundamentales de Dockerfile que nos va a permitir trabajar más cómodamente y mejor siguiendo las buenas prácticas tácitas de esta poderosa herramienta.
Crear una imagen en Docker es una de las partes más divertidas e interesantes de todo el proceso, y aunque siempre es recomendable trabajar dentro de lo posible con imágenes ya creadas por otros usuarios o empresas (ya que nos ahorra tiempo y minimiza los errores) crear una imagen a nuestra medida, aunque una tarea relativamente sencilla, puede esconder algunas consideraciones.
El comprenderlas y aplicarlas nos va a hacer la vida más fácil y a nuestro Dockerfile más sencillo de leer para nuestro equipo.
Caché: el orden altera el resultado.
Antes de escribir un Dockerfile hay que entender qué es el cache y cómo funciona.
Cada línea de código es una capa que Docker guarda en caché al crear la imagen y a la cual le asigna un id. Esto nos permite trabajar más rápidamente ya que si una línea no se modificó, al volver a ejecutar el Dockerfile Docker primero corrobora si la tenemos disponible en caché y de encontrarla pasará a la siguiente línea.
En el siguiente ejemplo tenemos seis capas.

Una buena práctica es siempre comenzar de arriba hacia abajo con las capas que menos vamos a modificar, por esa razón siempre se comienza con la imagen base.
Podemos luego ver que estamos copiando archivos en la segunda capa antes de realizar un update. Pero si más adelante decidimos modificar nuestra app, todas las líneas posteriores aunque no tuviesen cambios se correrian nuevamente si o si.
Con lo cual el orden ideal sería:

En este ejemplo también podemos ejecutar el update y el upgrade en una sola línea ya que son dependientes entre sí. Con esto ganamos en velocidad y nos permite depurar más fácilmente.

Imágenes y versiones específicas.
Siempre es recomendable basarse en las imágenes oficiales ya que nos ofrecen mayor documentación. Y es una buena práctica también documentar de manera clara nuestras propias imágenes, en caso de querer compartirlas en Docker Hub.
Siguiendo con el ejemplo anterior podemos ver otro detalle a corregir.
La etiqueta latest no se recomienda usar porque el día de mañana puede no estar refiriéndose a la misma versión de una imagen.
Siempre conviene especificar con qué versión estamos trabajando en un momento dado así todos tenemos el mismo resultado final. En este ejemplo lo modificaremos a la versión 20.04.

Directorios y dockerignore.
Otra buena práctica es siempre trabajar sobre un directorio vacío de ser posible, solo con el Dockerfile y los archivos mínimos necesarios para la imagen. De tener archivos que no queremos se incluyan al ejecutar el build podemos agregar un archivo .dockerignore. Esto nos va a permitir especificar que queremos que se excluya de la creación de la imagen.
Paquetes y multilínea.
Algo muy útil cuando trabajamos con instalación de paquetes es utilizar el parámetro –no-install-recommends para no instalar los paquetes recomendados y minimizar el peso final de nuestra imagen.
Además siempre conviene trabajar multilínea para mejorar la legibilidad del Dockerfile a quien necesite leerlo o modificarlo rápidamente.

¿Y ahora qué?
Si te gusto Docker y quieres aprenderlo como corresponde y desde cero, en Abatic ya lanzamos los primeros dos laboratorios 100% prácticos de nuestro Ciclo de Laboratorios Practicos de Docker en Ubuntu, el cual coronamos con nuestro certificado correspondiente.
Con material didáctico en video y pdf, en ellos encontrarás todo lo necesario para moverte cómodamente y agregar una skill fundamental y fundacional a tu repertorio.
Además el próximo Lunes 24 de Agosto lanzamos el tercer laboratorio dedicado específicamente a Dockerfile y la creación de imágenes.
Esperamos verte pronto.



Deja una respuesta