Forzar compilación limpia de una imagen en Docker

Isaac Tony 15 febrero 2024
  1. Crear una imagen en Docker
  2. Use la opción --no-cache para forzar la construcción limpia de una imagen en Docker
Forzar compilación limpia de una imagen en Docker

El tutorial discutirá y demostrará cómo forzar una construcción limpia de una imagen en Docker.

Crear una imagen en Docker

Usaremos una aplicación Flask simple para demostrar este concepto. Usando el siguiente comando, cree una aplicación simple llamada app.py dentro de la carpeta principal my-app.

touch app.py

Instale Python3 si no ha usado el comando.

sudo apt update && sudo apt install python3-venv

También podemos instalar Flask y Gunicorn usando el comando.

pip install flask gunicorn

Proceda a crear un archivo docker usando el comando touch Dockerfile. Para facilitarnos la creación de un archivo docker, creamos un archivo requirements.txt.

Podemos crear un archivo requisitos.txt ejecutando el comando pip freeze > requisitos.txt. Una vez hecho esto, la estructura de su archivo debería ser similar a la siguiente.

Estructura de archivos para una aplicación Docker en contenedores

Podemos proceder al archivo app.py y crear nuestra aplicación. La aplicación contiene una función simple que imprime un mensaje de consola, como se muestra a continuación.

from flask import Flask

app = Flask(__name__)

def hello():

    print("Hello, this is a simple Flask application")

hello()

Este es el resultado esperado cuando ejecutamos el código anterior.

Resultado del código al ejecutar nuestra aplicación Flask

Ahora completaremos nuestro Dockerfile con los comandos que Docker usará para crear una imagen. Estos comandos se ejecutarán cuando ejecutemos el contenedor docker.

Usaremos Python como nuestra imagen base en este caso. El Dockerfile debería verse así.

# base image
FROM python

# Set your working directory
WORKDIR /var/www/

# Copy the necessary files
COPY ./app.py /var/www/app.py
COPY ./requirements.txt /var/www/requirements.txt

# Install the necessary packages
RUN pip install -r /var/www/requirements.txt

# Run the app
CMD python3 app.py

Una vez que tengamos nuestro Dockerfile listo, podemos guardarlo y construir nuestra imagen localmente para probarla. Podemos usar el comando docker build junto con la etiqueta -t.

Creación de imágenes dentro de Docker

Luego, podemos probar la imagen usando el comando docker run, como se muestra a continuación.

(myapp) isaac@DESKTOP-HV44HT6:~/my-app$ docker run -it myapp
Hello, this is a simple Flask application

Confirmaremos que hemos construido con éxito un nuevo contenedor usando el comando docker ps.

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
dd10c9a6a8a1   myapp     "/bin/sh -c 'python3…"   11 minutes ago   Exited (0) 10 minutes ago             vigilant_brattain

Use la opción --no-cache para forzar la construcción limpia de una imagen en Docker

Habiendo construido un contenedor usando esta imagen, supongamos que queremos construir una imagen nuevamente usando la misma imagen. En ese caso, el demonio docker utilizará la memoria caché existente de las capas de la imagen para construir la imagen.

Sin embargo, podemos forzar una creación de imagen limpia en Docker usando la opción --no-cache. Esto anula el comportamiento predeterminado del demonio docker.

Así es como podemos implementar eso.

myapp) isaac@DESKTOP-HV44HT6:~/my-app$ docker build --no-cache -t myapp .
[+] Building 119.0s (10/10) FINISHED
 => [internal] load .dockerignore                                                                                                1.6s
 => => transferring context: 2B                                                                                                  0.4s
 => [internal] load build definition from Dockerfile                                                                             2.1s
 => => transferring dockerfile: 38B                                                                                              0.4s
 => [internal] load metadata for docker.io/library/python:latest                                                                37.9s
 => [1/5] FROM docker.io/library/python@sha256:ee0b617025e112b6ad7a4c76758e4a02f1c429e1b6c44410d95b024304698ff2                  0.1s
 => [internal] load build context                                                                                                0.4s
 => => transferring context: 63B                                                                                                 0.0s
 => CACHED [2/5] WORKDIR /var/www/                                                                                               0.1s
 => [3/5] COPY ./app.py /var/www/app.py                                                                                          1.3s
 => [4/5] COPY ./requirements.txt /var/www/requirements.txt                                                                      2.2s
 => [5/5] RUN pip install -r /var/www/requirements.txt                                                                          68.4s
 => exporting to image                                                                                                           4.8s 
 => => exporting layers                                                                                                          3.8s 
 => => writing image sha256:ee771b73a9ec468308375d139a35580f6c7f62988db9c0bb0b85794716406e92                                     0.1s 
 => => naming to docker.io/library/myapp

Podemos crear un nuevo contenedor usando el comando docker run.

(myapp) isaac@DESKTOP-HV44HT6:~/my-app$ docker run -it myapp
Hello, this is a simple Flask application

Como se ve a continuación, creamos con éxito un nuevo contenedor y forzamos a Docker a crear una imagen limpia usando la opción --no-cache.

$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
826b8de2c92f   myapp          "/bin/sh -c 'python3…"   47 seconds ago   Exited (0) 39 seconds ago             kind_pike
dd10c9a6a8a1   ba84c5d3b157   "/bin/sh -c 'python3…"   28 minutes ago   Exited (0) 28 minutes ago             vigilant_brattain
Autor: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

Artículo relacionado - Docker Image