Clean Build eines Images in Docker erzwingen

Isaac Tony 15 Februar 2024
  1. Erstellen Sie ein Image in Docker
  2. Verwenden Sie die Option --no-cache, um den sauberen Build eines Images in Docker zu erzwingen
Clean Build eines Images in Docker erzwingen

In diesem Tutorial wird erläutert und demonstriert, wie Sie einen sauberen Build eines Images in Docker erzwingen.

Erstellen Sie ein Image in Docker

Wir werden eine einfache Flask-Anwendung verwenden, um dieses Konzept zu demonstrieren. Erstellen Sie mit dem folgenden Befehl eine einfache Anwendung namens app.py im Hauptordner my-app.

touch app.py

Installieren Sie Python3, wenn Sie den Befehl nicht verwendet haben.

sudo apt update && sudo apt install python3-venv

Wir können Flask und Gunicorn auch mit dem Befehl installieren.

pip install flask gunicorn

Fahren Sie fort, um eine Docker-Datei mit dem Befehl touch Dockerfile zu erstellen. Um uns das Erstellen einer Docker-Datei zu erleichtern, erstellen wir eine requirements.txt-Datei.

Wir können eine requirements.txt-Datei erstellen, indem wir den Befehl pip freeze > requirements.txt ausführen. Sobald Sie fertig sind, sollte Ihre Dateistruktur der folgenden ähneln.

Dateistruktur für eine containerisierte Docker-Anwendung

Wir können mit der Datei app.py fortfahren und unsere Anwendung erstellen. Die Anwendung enthält eine einfache Funktion, die eine Konsolennachricht ausgibt, wie unten gezeigt.

from flask import Flask

app = Flask(__name__)

def hello():

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

hello()

Hier ist das zu erwartende Ergebnis, wenn wir den obigen Code ausführen.

Code-Ergebnis beim Ausführen unserer Flask-Anwendung

Jetzt füllen wir unser Dockerfile mit Befehlen, die Docker zum Erstellen eines Images verwendet. Diese Befehle werden ausgeführt, wenn wir den Docker-Container ausführen.

Wir werden in diesem Fall Python als unser Basis-Image verwenden. Das Dockerfile sollte so aussehen.

# 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

Sobald wir unser Dockerfile bereit haben, können wir es speichern und unser Image zum Testen lokal erstellen. Wir können den Befehl docker build zusammen mit dem Tag -t verwenden.

Image innerhalb von Docker erstellen

Dann können wir das Image mit dem Befehl docker run testen, wie unten gezeigt.

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

Wir bestätigen, dass wir erfolgreich einen neuen Container erstellt haben, indem wir den Befehl docker ps verwenden.

$ 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

Verwenden Sie die Option --no-cache, um den sauberen Build eines Images in Docker zu erzwingen

Angenommen, wir möchten nach dem Erstellen eines Containers mit diesem Image erneut ein Image mit demselben Image erstellen. In diesem Fall verwendet der Docker-Daemon den vorhandenen Cache der Bildebenen, um das Bild zu erstellen.

Wir können jedoch mit der Option --no-cache einen sauberen Image-Build in Docker erzwingen. Dies überschreibt das Standardverhalten des Docker-Daemons.

So können wir das umsetzen.

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

Mit dem Befehl docker run können wir einen neuen Container erstellen.

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

Wie unten zu sehen ist, haben wir erfolgreich einen neuen Container erstellt und Docker mit der Option --no-cache zu einem sauberen Build eines Images gezwungen.

$ 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

Verwandter Artikel - Docker Image