Wie man den docker buildx build Befehl zum Erstellen und Verwalten von Images verwendet

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab erhalten Sie praktische Erfahrung mit dem Befehl docker buildx build, um Docker-Images zu erstellen und zu verwalten. Sie beginnen mit dem Erstellen eines einfachen Images mit Standardeinstellungen und lernen, wie Sie Image-Anweisungen mit einer Dockerfile definieren.

Über die Grundlagen hinaus werden Sie fortgeschrittene Funktionen erkunden, wie die Verwendung von Build-Argumenten und das Zielen auf bestimmte Stufen innerhalb eines Multi-Stage-Builds. Sie werden auch lernen, wie Sie den Build-Cache effektiv verwalten, um Build-Zeiten mit --cache-from und --cache-to zu optimieren. Darüber hinaus führt Sie das Lab durch das Erstellen von Multi-Plattform-Images und das Pushen dieser in eine Registry. Es wird zudem demonstriert, wie Sie sicher Secrets und SSH-Agents während des Build-Prozesses verfügbar machen können.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ImageOperationsGroup -.-> docker/push("Push Image to Repository") docker/ImageOperationsGroup -.-> docker/rmi("Remove Image") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/SystemManagementGroup -.-> docker/login("Log into Docker Registry") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555045{{"Wie man den docker buildx build Befehl zum Erstellen und Verwalten von Images verwendet"}} docker/push -.-> lab-555045{{"Wie man den docker buildx build Befehl zum Erstellen und Verwalten von Images verwendet"}} docker/rmi -.-> lab-555045{{"Wie man den docker buildx build Befehl zum Erstellen und Verwalten von Images verwendet"}} docker/images -.-> lab-555045{{"Wie man den docker buildx build Befehl zum Erstellen und Verwalten von Images verwendet"}} docker/login -.-> lab-555045{{"Wie man den docker buildx build Befehl zum Erstellen und Verwalten von Images verwendet"}} docker/build -.-> lab-555045{{"Wie man den docker buildx build Befehl zum Erstellen und Verwalten von Images verwendet"}} end

Ein einfaches Image mit Standardeinstellungen erstellen

In diesem Schritt lernen Sie, wie Sie ein einfaches Docker-Image mit einer Dockerfile erstellen. Eine Dockerfile ist ein Textdokument, das alle Befehle enthält, die ein Benutzer auf der Kommandozeile aufrufen würde, um ein Image zusammenzustellen. Docker kann Images automatisch erstellen, indem es die Anweisungen aus einer Dockerfile liest.

Navigieren Sie zunächst in das Verzeichnis ~/project, das Ihr Arbeitsverzeichnis für dieses Lab ist.

cd ~/project

Nun erstellen wir eine einfache Dockerfile. Diese Dockerfile definiert ein Image, das auf dem Basis-Image ubuntu basiert und einfach "Hello, Docker!" ausgibt, wenn ein Container aus diesem Image gestartet wird.

Verwenden Sie den nano-Editor, um eine Datei namens Dockerfile im Verzeichnis ~/project zu erstellen.

nano Dockerfile

Fügen Sie den folgenden Inhalt zur Dockerfile hinzu:

FROM ubuntu:latest
CMD ["echo", "Hello, Docker!"]

Lassen Sie uns diese einfache Dockerfile aufschlüsseln:

  • FROM ubuntu:latest: Diese Anweisung setzt das Basis-Image für unser neues Image. Wir verwenden die neueste Version des offiziellen Ubuntu-Images von Docker Hub.
  • CMD ["echo", "Hello, Docker!"]: Diese Anweisung gibt den Befehl an, der ausgeführt wird, wenn ein Container aus diesem Image gestartet wird. In diesem Fall wird der echo-Befehl mit dem Argument "Hello, Docker!" ausgeführt.

Speichern Sie die Datei mit Strg + S und beenden Sie den nano-Editor mit Strg + X.

Nun, da wir unsere Dockerfile haben, können wir das Image mit dem Befehl docker build erstellen. Der . am Ende des Befehls weist Docker an, nach der Dockerfile im aktuellen Verzeichnis (~/project) zu suchen. Wir werden das Image auch mit einem Namen versehen, zum Beispiel my-hello-image.

docker build -t my-hello-image .

Sie sehen eine Ausgabe, die anzeigt, dass Docker das Image Schicht für Schicht erstellt. Es wird zunächst das ubuntu:latest-Image herunterladen, falls es noch nicht auf Ihrem System vorhanden ist, und dann die CMD-Anweisung ausführen.

Nachdem der Build abgeschlossen ist, können Sie überprüfen, ob das Image erfolgreich erstellt wurde, indem Sie die verfügbaren Images mit dem Befehl docker images auflisten.

docker images

Sie sollten my-hello-image in der Ausgabe sehen.

Abschließend starten wir einen Container aus unserem neu erstellten Image, um die Ausgabe der CMD-Anweisung zu sehen.

docker run my-hello-image

Sie sollten die Ausgabe "Hello, Docker!" in Ihrem Terminal sehen. Dies bestätigt, dass unser Image korrekt erstellt wurde und die CMD-Anweisung wie erwartet funktioniert.

Build-Argumente und Ziel-Stufen verwenden

In diesem Schritt lernen Sie, wie Sie Build-Argumente (ARG) und Ziel-Stufen in Ihrer Dockerfile verwenden, um flexiblere und effizientere Builds zu erstellen. Build-Argumente ermöglichen es Ihnen, Variablen an den Build-Prozess zu übergeben, während Ziel-Stufen es erlauben, mehrere Build-Stufen in einer einzelnen Dockerfile zu definieren und nur eine bestimmte Stufe zu bauen.

Stellen Sie zunächst sicher, dass Sie sich im Verzeichnis ~/project befinden.

cd ~/project

Lassen Sie uns unsere bestehende Dockerfile modifizieren, um ein Build-Argument und einen einfachen Multi-Stage-Build einzufügen. Wir definieren ein Argument für eine Grußnachricht und verwenden eine zweite Stufe, um eine Datei aus der ersten Stufe zu kopieren.

Öffnen Sie die Dockerfile mit nano:

nano Dockerfile

Ersetzen Sie den vorhandenen Inhalt durch folgenden:

## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo $GREETING > /app/greeting.txt

## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]

Die Änderungen im Detail:

  • ARG GREETING="Hello from build argument!": Diese Anweisung definiert ein Build-Argument namens GREETING mit einem Standardwert. Dieser kann während des Build-Prozesses überschrieben werden.
  • FROM ubuntu:latest as builder: Startet die erste Build-Stufe mit dem Namen builder. Nützlich für Multi-Stage-Builds.
  • RUN echo $GREETING > /app/greeting.txt: Erstellt in der builder-Stufe eine Datei greeting.txt im Verzeichnis /app und schreibt den Wert des GREETING-Arguments hinein.
  • FROM ubuntu:latest: Startet die zweite Build-Stufe. Standardmäßig wird dies das finale Image.
  • COPY --from=builder /app/greeting.txt /greeting.txt: Kopiert die Datei greeting.txt aus der builder-Stufe in das Wurzelverzeichnis (/) der aktuellen Stufe. So werden Artefakte zwischen Stufen übertragen.
  • CMD ["cat", "/greeting.txt"]: Definiert den Befehl, der beim Start eines Containers ausgeführt wird. Er gibt den Inhalt von /greeting.txt aus.

Speichern Sie die Dockerfile und beenden Sie nano.

Nun bauen wir das Image mit dem docker build-Befehl. Wir verwenden das Flag --build-arg, um einen benutzerdefinierten Wert für das GREETING-Argument zu übergeben, und taggen das Image als my-arg-image.

docker build --build-arg GREETING="Greetings from the command line!" -t my-arg-image .

Beobachten Sie die Ausgabe. Der Build-Prozess sollte das übergebene Argument verwenden.

Nach Abschluss des Builds listen Sie die Images auf, um my-arg-image zu bestätigen.

docker images

Starten Sie nun einen Container aus my-arg-image, um die Ausgabe zu sehen.

docker run my-arg-image

Sie sollten "Greetings from the command line!" sehen, was bestätigt, dass das Build-Argument verwendet wurde.

Als Nächstes bauen wir nur die builder-Stufe. Dies ist nützlich für Zwischen-Images mit Build-Artefakten. Wir verwenden das --target-Flag, um die Stufe anzugeben.

docker build --target builder -t my-builder-stage .

Listen Sie die Images erneut auf. Nun sollte my-builder-stage zusätzlich zu my-arg-image erscheinen.

docker images

Ein Container aus my-builder-stage wird nicht dieselbe Ausgabe wie my-arg-image produzieren, da die CMD-Anweisung der finalen Stufe fehlt. Versuchen Sie es (der Container wird wahrscheinlich sofort beenden, da kein Standardbefehl definiert ist).

docker run my-builder-stage

Dies demonstriert, wie Ziel-Stufen die Kontrolle darüber ermöglichen, welcher Teil Ihrer Dockerfile in ein Image gebaut wird.

Build-Cache mit --cache-from und --cache-to verwalten

In diesem Schritt lernen Sie, wie Sie den Docker-Build-Cache mit den Flags --cache-from und --cache-to verwalten. Der Build-Cache kann nachfolgende Builds deutlich beschleunigen, indem er Schichten aus vorherigen Builds wiederverwendet. --cache-from ermöglicht es Ihnen, ein Image als Cache-Quelle anzugeben, während --cache-to den Build-Cache an einen bestimmten Ort (wie eine Registry oder ein lokales Verzeichnis) exportiert.

Stellen Sie zunächst sicher, dass Sie sich im Verzeichnis ~/project befinden.

cd ~/project

Lassen Sie uns unsere Dockerfile leicht modifizieren, um eine Änderung zu simulieren, die normalerweise den Cache ungültig machen würde. Wir fügen eine einfache RUN-Anweisung hinzu.

Öffnen Sie die Dockerfile mit nano:

nano Dockerfile

Fügen Sie nach der ARG-Anweisung in der builder-Stufe folgende Zeile hinzu:

RUN echo "Adding a new layer"

Die aktualisierte Dockerfile sollte nun so aussehen:

## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding a new layer"
RUN echo $GREETING > /app/greeting.txt

## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]

Speichern Sie die Dockerfile und beenden Sie nano.

Nun bauen wir das Image erneut, ohne spezifische Cache-Optionen zu verwenden. Docker wird automatisch den lokalen Cache nutzen, falls verfügbar.

docker build -t my-cached-image .

Sie sollten sehen, dass einige Schichten neu gebaut werden, da wir eine neue Anweisung hinzugefügt haben, die den Cache für nachfolgende Anweisungen ungültig macht.

Simulieren wir nun ein Szenario, in dem Sie ein zuvor gebautes Image als Cache-Quelle verwenden möchten, beispielsweise aus einer Registry oder einem anderen Build. Für die Demonstration verwenden wir das gerade gebaute my-cached-image als Cache-Quelle für einen neuen Build.

Ändern wir zunächst die Dockerfile erneut, um eine weitere Modifikation zu simulieren.

Öffnen Sie die Dockerfile:

nano Dockerfile

Ändern Sie die Nachricht in der neuen RUN-Anweisung:

RUN echo "Adding another new layer"

Die aktualisierte Dockerfile sollte nun so aussehen:

## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding another new layer"
RUN echo $GREETING > /app/greeting.txt

## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]

Speichern und beenden Sie nano.

Bauen Sie das Image nun erneut, diesmal mit dem --cache-from-Flag, um my-cached-image als Cache-Quelle anzugeben.

docker build --cache-from my-cached-image -t my-cached-image-from .

Sie sollten beobachten, dass Docker versucht, Schichten aus my-cached-image zu verwenden. Die Schicht der ersten RUN-Anweisung wird wahrscheinlich neu gebaut, da sich die Anweisung geändert hat, aber nachfolgende Schichten könnten aus dem Cache geladen werden, wenn sie übereinstimmen.

Das --cache-to-Flag wird verwendet, um den Build-Cache zu exportieren. Dies ist besonders in CI/CD-Pipelines nützlich, um Cache zwischen Builds zu teilen. Für --cache-to benötigen Sie typischerweise einen Build-Treiber, der den Cache-Export unterstützt, wie den docker-container-Treiber.

Installieren wir zunächst Docker Compose, das oft mit buildx verwendet wird.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Erstellen wir nun eine buildx-Builder-Instanz.

docker buildx create --use

Bauen wir nun das Image und exportieren den Cache in ein lokales Verzeichnis. Wir verwenden den local-Cache-Exporter.

docker buildx build --cache-to type=local,dest=./build-cache -t my-exported-cache-image . --load
  • docker buildx build: Verwendet das buildx-Tool für den Build.
  • --cache-to type=local,dest=./build-cache: Exportiert den Cache in ein lokales Verzeichnis namens build-cache im aktuellen Verzeichnis.
  • -t my-exported-cache-image: Taggt das resultierende Image.
  • .: Gibt den Build-Kontext (aktuelles Verzeichnis) an.
  • --load: Lädt das gebaute Image in den lokalen Docker-Image-Cache.

Sie sollten eine Ausgabe sehen, die den Build und den Cache-Export anzeigt. Ein build-cache-Verzeichnis wird in Ihrem ~/project-Verzeichnis erstellt.

Simulieren wir nun eine saubere Build-Umgebung und versuchen, mit dem exportierten Cache zu bauen. Entfernen wir zunächst die gebauten Images.

docker rmi my-cached-image my-cached-image-from my-exported-cache-image

Bauen Sie das Image nun erneut, diesmal mit dem exportierten Cache als Quelle.

docker buildx build --cache-from type=local,src=./build-cache -t my-imported-cache-image . --load
  • --cache-from type=local,src=./build-cache: Importiert den Cache aus dem lokalen Verzeichnis build-cache.

Sie sollten beobachten, dass Docker die Schichten aus dem exportierten Cache verwendet, was den Build-Prozess im Vergleich zu einem Neubau deutlich beschleunigt.

Multi-Plattform-Images erstellen und in eine Registry pushen

In diesem Schritt lernen Sie, wie Sie Docker-Images für mehrere Architekturen (wie linux/amd64 und linux/arm64) erstellen und in eine Container-Registry pushen. Das Erstellen von Multi-Plattform-Images ist essenziell, um sicherzustellen, dass Ihre Anwendungen auf verschiedenen Hardware-Typen laufen können. Wir verwenden Docker Buildx, das Sie im vorherigen Schritt initialisiert haben.

Stellen Sie zunächst sicher, dass Sie sich im Verzeichnis ~/project befinden.

cd ~/project

Wir verwenden unsere bestehende Dockerfile für diesen Schritt. Lassen Sie uns ein Image für die Plattformen linux/amd64 und linux/arm64 erstellen. Wir taggen das Image mit einem Namen und einer Version, z.B. your-dockerhub-username/my-multi-platform-image:latest. Ersetzen Sie your-dockerhub-username mit Ihrem tatsächlichen Docker Hub-Benutzernamen. Falls Sie kein Docker Hub-Konto haben, können Sie kostenlos eines erstellen.

Um für mehrere Plattformen zu bauen, verwenden wir das --platform-Flag mit docker buildx build. Zusätzlich benötigen wir das --push-Flag, um die resultierende Manifest-Liste und die Images in eine Registry zu pushen.

docker buildx build --platform linux/amd64,linux/arm64 -t your-dockerhub-username/my-multi-platform-image:latest . --push

Hinweis: Dieser Befehl erfordert, dass Sie bei Docker Hub eingeloggt sind, falls Sie dies noch nicht getan haben. Sie können sich mit dem docker login-Befehl in einer separaten Terminal-Sitzung anmelden.

docker login

Geben Sie Ihren Docker Hub-Benutzernamen und Ihr Passwort ein, wenn Sie dazu aufgefordert werden.

Nachdem Sie eingeloggt sind, führen Sie den docker buildx build-Befehl erneut aus.

Der Build-Prozess dauert länger als ein Single-Plattform-Build, da das Image für jede angegebene Architektur erstellt wird. Nach Abschluss des Builds erstellt Buildx eine Manifest-Liste, die auf die Images für jede Plattform verweist, und pusht alles in Ihr angegebenes Docker Hub-Repository.

Sie können überprüfen, ob das Multi-Plattform-Image gepusht wurde, indem Sie Ihr Docker Hub-Repository in einem Webbrowser aufrufen. Sie sollten my-multi-platform-image mit dem Tag latest sehen, und unter dem Tab "Tags" sollte angezeigt werden, dass mehrere Architekturen unterstützt werden.

Alternativ können Sie den Befehl docker buildx imagetools inspect verwenden, um die gerade gepushte Manifest-Liste zu inspizieren. Ersetzen Sie your-dockerhub-username mit Ihrem Benutzernamen.

docker buildx imagetools inspect your-dockerhub-username/my-multi-platform-image:latest

Die Ausgabe zeigt die Manifest-Liste und die verschiedenen Images (mit ihren jeweiligen Architekturen), auf die sie verweist.

Dies demonstriert, wie Sie Images erstellen und pushen können, die auf verschiedenen CPU-Architekturen laufen, wodurch Ihre Docker-Images vielseitiger werden.

Geheime Daten und SSH-Agent für den Build verfügbar machen

In diesem Schritt lernen Sie, wie Sie sicher geheime Daten und Ihren SSH-Agenten mit Buildx für den Docker-Build-Prozess verfügbar machen können. Dies ist entscheidend für Szenarien, in denen Ihr Build auf private Repositories zugreifen, private Pakete installieren oder mit externen Diensten interagieren muss, die Authentifizierung erfordern, ohne sensible Informationen direkt in Ihrer Dockerfile zu hinterlegen.

Stellen Sie zunächst sicher, dass Sie sich im Verzeichnis ~/project befinden.

cd ~/project

Wir werden unsere Dockerfile anpassen, um die Verwendung eines Secrets während des Builds zu demonstrieren. Für dieses Beispiel erstellen wir eine Dummy-Secret-Datei und lesen deren Inhalt während des Builds.

Erstellen Sie eine Datei namens mysecret.txt im Verzeichnis ~/project mit einem geheimen Inhalt.

echo "This is a secret message!" > ~/project/mysecret.txt

Öffnen Sie nun die Dockerfile mit nano:

nano Dockerfile

Fügen Sie eine neue RUN-Anweisung in der builder-Stufe hinzu, die das Flag --mount=type=secret verwendet, um auf das Secret zuzugreifen.

## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding another new layer"
RUN echo $GREETING > /app/greeting.txt
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_content.txt

## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
COPY --from=builder /app/secret_content.txt /secret_content.txt
CMD ["cat", "/greeting.txt", "/secret_content.txt"]

Lassen Sie uns die neue Anweisung verstehen:

  • RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_content.txt: Diese Anweisung bindet ein Secret in den Build-Container ein.
    • --mount=type=secret: Gibt an, dass wir ein Secret einbinden.
    • id=mysecret: Dies ist die ID des Secrets, die wir während des Builds angeben werden.
    • cat /run/secrets/mysecret: Innerhalb des Build-Containers ist das Secret unter /run/secrets/mysecret verfügbar. Wir verwenden cat, um dessen Inhalt zu lesen.
    • > /app/secret_content.txt: Wir leiten den Secret-Inhalt in eine Datei namens secret_content.txt im /app-Verzeichnis der Builder-Stufe um.

Wir haben auch eine COPY-Anweisung in der finalen Stufe hinzugefügt, um die secret_content.txt-Datei aus der Builder-Stufe zu kopieren.

Speichern Sie die Dockerfile und beenden Sie nano.

Bauen Sie nun das Image mit docker buildx build und geben Sie das Secret mit dem --secret-Flag an.

docker buildx build --secret id=mysecret,src=~/project/mysecret.txt -t my-secret-image . --load
  • --secret id=mysecret,src=~/project/mysecret.txt: Dieses Flag stellt das Secret für den Build bereit.
    • id=mysecret: Entspricht der in der Dockerfile angegebenen ID.
    • src=~/project/mysecret.txt: Gibt den Pfad zur Secret-Datei auf Ihrem lokalen Rechner an.

Der Build-Prozess hat nun während der Ausführung der RUN --mount=type=secret...-Anweisung Zugriff auf den Inhalt von mysecret.txt. Der Secret-Inhalt wird nicht in den finalen Image-Layern gespeichert.

Nach Abschluss des Builds führen Sie einen Container aus dem Image aus.

docker run my-secret-image

Sie sollten sowohl die Begrüßungsnachricht als auch den Inhalt Ihrer Secret-Datei in der Konsole ausgegeben sehen.

Demonstrieren wir nun, wie Sie Ihren SSH-Agenten für den Build verfügbar machen. Dies ist nützlich, um während des Build-Prozesses private Git-Repositories zu klonen.

Stellen Sie zunächst sicher, dass Ihr SSH-Agent läuft und Ihren Schlüssel geladen hat. Sie können dies typischerweise mit ssh-add -l überprüfen. Falls Ihr Agent nicht läuft oder Ihr Schlüssel nicht hinzugefügt wurde, müssen Sie den Agenten möglicherweise starten und Ihren Schlüssel hinzufügen.

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa ## Ersetzen Sie dies durch Ihren SSH-Schlüssel-Pfad, falls abweichend

Passen Sie nun die Dockerfile an, um den SSH-Agenten zu verwenden. Wir fügen eine RUN-Anweisung hinzu, die versucht, ein (nicht existierendes) privates Repository über SSH zu klonen.

Öffnen Sie die Dockerfile:

nano Dockerfile

Fügen Sie eine neue RUN-Anweisung in der builder-Stufe hinzu, die das --mount=type=ssh-Flag verwendet.

## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding another new layer"
RUN echo $GREETING > /app/greeting.txt
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_content.txt
RUN --mount=type=ssh git clone [email protected]:your-username/your-private-repo.git || echo "Skipping git clone as this is a demo"

## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
COPY --from=builder /app/secret_content.txt /secret_content.txt
CMD ["cat", "/greeting.txt", "/secret_content.txt"]

Hinweis: Ersetzen Sie your-username/your-private-repo.git durch einen Platzhalter für eine private Repository-URL. Der Teil || echo "Skipping git clone as this is a demo" wurde hinzugefügt, damit der Build nicht fehlschlägt, falls das Repository nicht existiert oder Sie keinen Zugriff haben.

Speichern Sie die Dockerfile und beenden Sie nano.

Bauen Sie nun das Image mit docker buildx build und stellen Sie den Zugriff auf Ihren SSH-Agenten mit dem --ssh-Flag bereit.

docker buildx build --ssh default -t my-ssh-image . --load
  • --ssh default: Dieses Flag macht Ihren Standard-SSH-Agenten für den Build verfügbar.

Während des Builds kann die RUN --mount=type=ssh...-Anweisung Ihren SSH-Agenten zur Authentifizierung beim Git-Server verwenden.

Nach Abschluss des Builds können Sie das Image ausführen, obwohl die Ausgabe dieselbe wie zuvor sein wird, da der Git-Klon-Vorgang wahrscheinlich übersprungen wurde.

docker run my-ssh-image

Dies demonstriert, wie Sie sicher geheime Daten und Ihren SSH-Agenten während des Docker-Build-Prozesses mit Buildx verwenden können, ohne sensible Informationen in Ihren Images zu hinterlegen.

Zusammenfassung

In diesem Lab haben Sie die Grundlagen des Erstellens von Docker-Images mit einer Dockerfile gelernt. Sie begannen mit der Erstellung einer einfachen Dockerfile, die ein Image auf Ubuntu-Basis definiert und einen grundlegenden Befehl ausführt. Anschließend verwendeten Sie den Befehl docker build, um dieses Image zu erstellen, wobei Sie verstanden haben, wie Docker die Anweisungen in der Dockerfile schichtweise verarbeitet und wie das resultierende Image getaggt wird.

Aufbauend auf den Grundlagen haben Sie erweiterte Funktionen des docker buildx build-Befehls erkundet. Dazu gehörte die Verwendung von Build-Argumenten, um dynamische Werte in den Build-Prozess zu übergeben, sowie die Nutzung von Zielstufen innerhalb eines Multi-Stage-Builds, um die Image-Größe und Build-Zeit zu optimieren. Sie haben auch gelernt, wie Sie den Build-Cache effektiv mit --cache-from und --cache-to verwalten, um nachfolgende Builds zu beschleunigen. Darüber hinaus haben Sie Erfahrungen mit dem Erstellen von Multi-Plattform-Images gesammelt, die es ermöglichen, Ihre Images auf verschiedenen Architekturen auszuführen, und diese Multi-Plattform-Images in eine Container-Registry zu pushen. Schließlich haben Sie entdeckt, wie Sie sicher geheime Daten verfügbar machen und einen SSH-Agenten während des Build-Prozesses nutzen können, was die Sicherheit und Flexibilität Ihrer Image-Builds erhöht.