Bevor wir uns ansehen, was ein Dockerfile ist, führen wir ein kleines Experiment durch. Erinnern Sie sich an das Python-Image, das wir im vorherigen Abschnitt gepullt haben? Betreten wir zunächst den Container mit dem Befehl docker run -it. Zur Erinnerung: Der Parameter -it weist dem Container ein Pseudo-TTY zu, sodass der Benutzer damit interagieren kann. Sobald wir im Container sind, listen wir alle Dateien im aktuellen Verzeichnis auf:
[root@novita ~]# docker run -it python:3.7 /bin/bash
root@692f87774bf7:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@692f87774bf7:/#
Als Nächstes erstellen wir eine Datei namens hello.py und listen dann alle Dateien erneut auf:
root@692f87774bf7:/# touch hello.py
root@692f87774bf7:/# ls
bin boot dev etc hello.py home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
Sie sehen, dass hello.py erstellt wurde. Jetzt verlassen wir den Container und betreten den interaktiven Modus des Containers erneut mit demselben Befehl docker run -it python:3.7 /bin/bash, gefolgt von der Auflistung aller Dateien:
root@692f87774bf7:/# exit
exit
[root@novita ~]# docker run -it python:3.7 /bin/bash
root@65c767655e8a:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@65c767655e8a:/#
Sie haben das Problem wahrscheinlich schon bemerkt. Seltsamerweise ist die zuvor erstellte Datei verschwunden. Dies liegt daran, dass Aktionen innerhalb des Containers das Image nicht verändern. Der Container fügt lediglich eine beschreibbare Schicht über dem Image hinzu, wie Transparentpapier über einer Kalligraphie-Vorlage – egal, was Sie auf das Transparentpapier schreiben, es beeinflusst nicht die darunterliegende Schicht. Diese Eigenschaft ähnelt ein wenig einer VM-Snapshot. Aber hier liegt das Problem: Wenn Aktionen innerhalb des Containers das Image nicht verändern, wie können wir dann eine schnelle Bereitstellung erreichen, ohne bestimmte Vorgänge vor jeder Codebereitstellung zu wiederholen? Das wäre ziemlich ineffizient. Angenommen, Sie sind der technische Leiter einer Social-Media-Plattform und plötzlich gibt es ein virales Ereignis, das eine schnelle Skalierung auf Hunderte von Cloud-Servern erfordert, um die massive Benutzerlast zu bewältigen. Ihr Team hat Docker für die Anwendungsbereitstellung gewählt. Wenn Sie mit der obigen Methode bereitstellen würden, könnten die Benutzer enttäuscht sein. Bis Ihr Dienst wiederhergestellt ist, sind sie vielleicht schon weitergezogen. Hier kommt das Dockerfile ins Spiel. Laut offizieller Einführung von Docker: Docker kann Images automatisch erstellen, indem es die Anweisungen aus einem Dockerfile liest. Ein Dockerfile ist ein Textdokument, das alle Befehle enthält, die ein Benutzer in der Befehlszeile aufrufen könnte, um ein Image zusammenzustellen. Mit docker build können Benutzer einen automatisierten Build erstellen, der mehrere Befehlszeilenanweisungen nacheinander ausführt. Einfacher ausgedrückt: Ein Dockerfile ist ein Textdokument, das alle Befehle enthält, die zum Erstellen eines Images aus der Befehlszeile erforderlich sind. Es ist wie eine Bedienungsanleitung für den Zusammenbau eines gewünschten Images aus Bausteinen. Lassen Sie uns erkunden, wie wir ein Dockerfile anhand eines praktischen Szenarios erstellen, wobei wir ein Python-Image als Beispiel verwenden. Auf meinem lokalen Rechner (außerhalb des Containers) befindet sich ein Python-Skript namens Optimal_Hotel_Matching.py. Es ist ein Web-Scraping-Programm. Versuchen wir, es innerhalb des Containers auszuführen: Wie erwartet gibt es einen Fehler, da die HTTP-Bibliothek requests, ein Drittanbieter-Modul, im Python-Image nicht installiert ist. Dies ist ein typisches Szenario, in dem wir eine abhängige Umgebung einrichten müssen. Versuchen wir, dies mit einem Dockerfile zu lösen. Bevor wir unser erstes Dockerfile schreiben, machen wir uns mit einigen gängigen Dockerfile-Anweisungen vertraut:
FROM: Gibt das zu verwendende Basis-Image für den Build an.MAINTAINER: Beschreibt den Ersteller des Images mit Name und E-Mail.RUN: Einer der wichtigsten Befehle in einem Dockerfile. Er führt Befehle im Container aus und übernimmt die Ergebnisse.CMD: Gibt den Befehl an, der beim Start des Containers ausgeführt werden soll.COPY: Kopiert Dateien vom Host-Dateisystem in den Container.WORKDIR: Legt das Arbeitsverzeichnis für alle nachfolgendenRUN-,CMD- oderENTRYPOINT-Befehle im Dockerfile fest.
Jetzt schreiben wir unser erstes Dockerfile, um unsere Anforderungen zu erfüllen: Installieren der requests-Bibliothek und Ausführen des Skripts. Hier ist eine mögliche Lösung:
FROM python:3.7 # Basis-Image als python:3.7 festlegen
MAINTAINER ultra "tech@novita.ai" # Name und E-Mail des Image-Erstellers
RUN pip install requests # requests-Bibliothek installieren
WORKDIR /dockerfileTest # Arbeitsverzeichnis festlegen
COPY . . # Aktuellen Verzeichnisinhalt in den Container kopieren
CMD ["python", "Optimal_Hotel_Matching.py"] # Befehl zum Ausführen des Skripts
Speichern Sie den obigen Inhalt in einer Datei namens Dockerfile in Ihrem Projektverzeichnis. Jetzt erstellen wir das Image mit dem Befehl docker build und versehen es mit einem Tag zur einfachen Identifizierung:
[root@novita dockerfileTest]# docker build --tag python:requests .
Sending build context to Docker daemon 5.12 kB
...
Nach Abschluss des Builds überprüfen wir mit dem Befehl docker images:
[root@novita dockerfileTest]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python requests 04f20acdc288 2 hours ago 926 MB
...
Sie sehen, dass lokal ein neues Python-Image mit dem Tag requests erstellt wurde. Versuchen Sie, dieses Image auszuführen, um zu sehen, ob der Fehler No module named 'requests' weiterhin auftritt und ob das Programm wie erwartet läuft.
[root@novita dockerfileTest]# docker run python:requests
Computing distance between 116.368816,39.866464 and 116.438946,39.921624
Computing distance between 116.370910,39.869603 and 116.438946,39.921624
...
Erfolg! Der Container führte den Code aus und beendete sich. Ist das alles? In diesem Beitrag habe ich eine einfache Anwendung von Dockerfiles vorgestellt. In tatsächlichen Produktionsumgebungen von Unternehmen sind Dockerfiles oft komplexer.
Novita AI ist die All-in-One-Cloud-Plattform, die Ihre KI-Ambitionen unterstützt. Mit nahtlos integrierten APIs, serverlosem Computing und GPU-Beschleunigung bieten wir die kosteneffizienten Tools, die Sie benötigen, um Ihr KI-gesteuertes Geschäft schnell aufzubauen und zu skalieren. Beseitigen Sie Infrastruktur-Sorgen und starten Sie kostenlos – Novita AI macht Ihre KI-Träume wahr.
Empfohlene Lektüre:
