Forcer la construction propre d'une image dans Docker

Isaac Tony 15 février 2024
  1. Construire une image dans Docker
  2. Utilisez l’option --no-cache pour forcer la construction propre d’une image dans Docker
Forcer la construction propre d'une image dans Docker

Le tutoriel discutera et montrera comment forcer une construction propre d’une image dans Docker.

Construire une image dans Docker

Nous utiliserons une simple application Flask pour démontrer ce concept. À l’aide de la commande ci-dessous, créez une application simple nommée app.py dans le dossier principal my-app.

touch app.py

Installez Python3 si vous n’avez pas utilisé la commande.

sudo apt update && sudo apt install python3-venv

Nous pouvons également installer Flask et Gunicorn en utilisant la commande.

pip install flask gunicorn

Procédez à la création d’un fichier docker à l’aide de la commande touch Dockerfile. Pour nous faciliter la création d’un fichier docker, nous créons un fichier requirements.txt.

Nous pouvons créer un fichier requirements.txt en exécutant la commande pip freeze > requirements.txt. Une fois cela fait, votre structure de fichiers devrait être similaire à celle ci-dessous.

Structure de fichier pour une application Docker conteneurisée

Nous pouvons passer au fichier app.py et créer notre application. L’application contient une fonction simple qui imprime un message de console, comme illustré ci-dessous.

from flask import Flask

app = Flask(__name__)

def hello():

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

hello()

Voici le résultat à attendre lorsque nous exécutons le code ci-dessus.

Résultat du code lors de l’exécution de notre application Flask

Nous allons maintenant remplir notre Dockerfile avec des commandes que Docker utilisera pour créer une image. Ces commandes seront exécutées lorsque nous exécuterons le conteneur docker.

Nous utiliserons Python comme image de base dans ce cas. Le Dockerfile devrait ressembler à ceci.

# 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

Une fois que nous avons notre Dockerfile prêt, nous pouvons l’enregistrer et créer notre image localement pour les tests. Nous pouvons utiliser la commande docker build à côté de la balise -t.

Création d’image dans Docker

Ensuite, nous pouvons tester l’image à l’aide de la commande docker run, comme indiqué ci-dessous.

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

Nous confirmerons que nous avons construit avec succès un nouveau conteneur à l’aide de la commande 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

Utilisez l’option --no-cache pour forcer la construction propre d’une image dans Docker

Après avoir construit un conteneur à l’aide de cette image, supposons que nous voulions à nouveau construire une image à l’aide de la même image. Dans ce cas, le démon docker utilisera le cache existant des couches d’image pour créer l’image.

Cependant, nous pouvons forcer une construction d’image propre dans Docker en utilisant l’option --no-cache. Cela remplace le comportement par défaut du démon docker.

Voici comment nous pouvons mettre cela en œuvre.

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

Nous pouvons créer un nouveau conteneur en utilisant la commande docker run.

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

Comme on le voit ci-dessous, nous avons construit avec succès un nouveau conteneur et forcé Docker pour une construction propre d’une image en utilisant l’option --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
Auteur: 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

Article connexe - Docker Image