En nuestra primera publicación vamos a ver cómo se puede optimizar el orden de los comandos en un Dockerfile,
De las primeras cosas que se explican a la hora de aprender a generar imágenes con Docker es cómo se componen de capas y cómo cada modificación provoca que se genere una capa nueva en la imagen sobre la anterior.
De esta forma si escribimos:
«`dockerfile
FROM alpine
RUN touch hello.txt
«`
Logramos tener una capa que es la imagen base de Alpine y una segunda capa con el archivo /hola.txt
A raíz de ahí se puede pasar a optimizar la gestión de dependencias.
Es evidente que los proyectos no suelen tener imágenes tan simples. Por ejemplo, un proyecto de PHP podría ser algo así:
«`dockerfile
FROM php:7.2-fpm-alpine
RUN curl -sS https://getcomposer.org/installer | php — –install-dir=/usr/local/bin –filename=composer \
&& composer –version
COPY . /app
WORKDIR /app
RUN composer install –no-interaction –no-progress –no-scripts
«`
Los pasos para optimizar la gestión de dependencias son:
1. Obtener la imagen base para PHP FPM
2. Conseguir e instalar Composer
3. Copiar el código que contiene composer.json y composer.lock
4. Instalar las dependencias
Tras esto, el Dockerfile funcionará pero con un pequeño problema: cada vez que modifiquemos parte del código y queramos generar la imagen del último paso, habrá que instalar las dependencias de nuevo.
Esto ocurre al tomarse como base la última capa cacheada, que será la anterior a copiar nuestro código.
Por ello, para solventar este problema podemos pasar a modificar el Dockerfile de la siguiente forma:
«`dockerfile
FROM php:7.2-fpm-alpine
RUN curl -sS https://getcomposer.org/installer | php — –install-dir=/usr/local/bin –filename=composer \
&& composer –version
COPY composer.* /app
WORKDIR /app
RUN composer install –no-interaction –no-progress –no-scripts
COPY . /app
«`
Primero copiamos los archivos de Composer donde están definidas nuestras dependencias y las instalamos. Posteriormente, copiamos los archivos de nuestro proyecto para conseguir que instale las dependencias solo cuando estas cambian.
En esta imagen se puede ver por ejemplo cómo se genera la carpeta vendor con las dependencias del proyecto.
Aquí vemos cómo en el último comando los únicos archivos que se añaden son los del proyecto.
¡EXTRA!
Para saber qué ocurre en una imagen de Docker hemos utilizado la herramienta Dive, os recomendamos que le echéis un ojo si no la conocíais antes.