Fortgeschrittene Dockerfile-Anweisungen
In diesem letzten Schritt werden wir einige zusätzliche Dockerfile-Anweisungen und bewährte Verfahren untersuchen, die dazu beitragen können, Ihre Docker-Images sicherer, wartbarer und einfacher zu verwenden zu machen. Wir werden uns auch auf die Fehlerbehebung und die Überprüfung jeder Stufe des Prozesses konzentrieren.
-
Öffnen Sie in der WebIDE erneut die Dockerfile
.
-
Ersetzen Sie den Inhalt durch Folgendes:
## Build stage
FROM python:3.9-slim AS builder
WORKDIR /app
COPY requirements.txt.
RUN pip install --user --no-cache-dir -r requirements.txt
## Final stage
FROM python:3.9-slim
## Create a non-root user
RUN useradd -m appuser
## Install curl for healthcheck
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
WORKDIR /app
## Dynamically determine Python version and site-packages path
RUN PYTHON_VERSION=$(python -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') && \
SITE_PACKAGES_PATH="/home/appuser/.local/lib/python${PYTHON_VERSION}/site-packages" && \
mkdir -p "${SITE_PACKAGES_PATH}" && \
chown -R appuser:appuser /home/appuser/.local
## Copy site-packages and binaries using the variable
COPY --from=builder /root/.local/lib/python3.9/site-packages "${SITE_PACKAGES_PATH}"
COPY --from=builder /root/.local/bin /home/appuser/.local/bin
COPY app.py.
ENV PATH=/home/appuser/.local/bin:$PATH
ENV ENVIRONMENT=production
## Set the user to run the application
USER appuser
## Use ENTRYPOINT with CMD
ENTRYPOINT ["python"]
CMD ["app.py"]
EXPOSE 5000
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:5000/ || exit 1
ARG BUILD_VERSION
LABEL maintainer="Your Name <[email protected]>"
LABEL version="${BUILD_VERSION:-1.0}"
LABEL description="Flask app demo with advanced Dockerfile techniques"
Lassen Sie uns die neuen Konzepte, die in diesem Dockerfile eingeführt wurden, analysieren:
RUN useradd -m appuser
: Dies erstellt einen neuen Benutzer namens appuser
im Container. Das Ausführen von Anwendungen als Nicht-Root-Benutzer ist eine bewährte Sicherheitsmethode, da es den potenziellen Schaden begrenzt, wenn die Anwendung kompromittiert wird. Das -m
-Flag erstellt ein Heimatverzeichnis für den Benutzer.
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
: Dies installiert das curl
-Paket, das für die Ausführung unserer HEALTHCHECK
-Anweisung erforderlich ist. Wir bereinigen auch den apt
-Cache, um die Größe des Images zu reduzieren.
RUN PYTHON_VERSION=$(python -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') &&...
: Diese Befehlssammlung ermittelt dynamisch die Python-Version im Container und erstellt das richtige site-packages
-Verzeichnis für den appuser
. Sie setzt auch die richtigen Berechtigungen für das lokale Verzeichnis des Benutzers.
COPY --from=builder /root/.local/lib/python3.9/site-packages "${SITE_PACKAGES_PATH}"
: Diese Anweisung kopiert die installierten Python-Pakete aus der builder
-Stufe in den dynamisch ermittelten site-packages
-Pfad im finalen Image, um sicherzustellen, dass die Pakete an der richtigen Stelle für den appuser
platziert werden.
COPY --from=builder /root/.local/bin /home/appuser/.local/bin
: Dies kopiert ausführbare Skripte, die von pip
installiert wurden (z. B. die Befehlszeilenschnittstelle von Flask, falls vorhanden), aus der builder
-Stufe in das lokale bin
-Verzeichnis des appuser
.
ENTRYPOINT ["python"]
mit CMD ["app.py"]
: Wenn zusammen verwendet, definiert ENTRYPOINT
das Hauptausführbare für den Container (in diesem Fall python
), und CMD
liefert die Standardargumente für dieses Ausführbare (app.py
). Dieses Muster ermöglicht Flexibilität: Benutzer können den Container ausführen und standardmäßig app.py
ausführen, oder sie können CMD
überschreiben, um andere Python-Skripte oder Befehle auszuführen.
HEALTHCHECK
: Diese Anweisung konfiguriert eine Integritätsprüfung für den Container. Docker führt periodisch den angegebenen Befehl (curl -f http://localhost:5000/
) aus, um zu bestimmen, ob der Container gesund ist. Die Flags --interval=30s
und --timeout=3s
setzen das Prüfintervall bzw. das Timeout. Wenn der curl
-Befehl fehlschlägt (gibt einen Exit-Code ungleich Null zurück), wird der Container als ungesund angesehen.
ARG BUILD_VERSION
: Dies definiert ein Build-Argument namens BUILD_VERSION
. Build-Argumente ermöglichen es Ihnen, Werte zur Build-Zeit in das Docker-Image zu übergeben.
LABEL version="${BUILD_VERSION:-1.0}"
: Dies setzt ein Label namens version
auf dem Docker-Image. Es verwendet das Build-Argument BUILD_VERSION
. Wenn BUILD_VERSION
während des Builds angegeben wird, wird sein Wert verwendet; andernfalls wird standardmäßig 1.0
verwendet (unter Verwendung der :-
-Syntax für Standardwerte).
- Jetzt lassen Sie uns dieses neue Image erstellen und eine Build-Version angeben:
docker build -t advanced-flask-app-v2 --build-arg BUILD_VERSION=2.0.
Das Flag --build-arg BUILD_VERSION=2.0
ermöglicht es uns, den Wert 2.0
für das Build-Argument BUILD_VERSION
während des Image-Build-Prozesses zu übergeben. Dieser Wert wird verwendet, um das version
-Label im Docker-Image zu setzen.
- Sobald der Build abgeschlossen ist, lassen Sie uns überprüfen, ob das Image erfolgreich erstellt wurde:
docker images | grep advanced-flask-app-v2
Sie sollten das neue Image advanced-flask-app-v2
in der Ausgabe des Befehls docker images
sehen, zusammen mit seinem Tag, der Image-ID, dem Erstellungsdatum und der Größe.
- Jetzt lassen Sie uns einen Container mit dem neuen Image ausführen:
docker run -d -p 5002:5000 --name advanced-container-v2 advanced-flask-app-v2
Dieser Befehl führt einen Container im detached-Modus (-d
) aus, bildet Port 5002 auf Ihrem Host auf Port 5000 im Container ab (-p 5002:5000
), benennt den Container advanced-container-v2
(--name advanced-container-v2
) und verwendet das advanced-flask-app-v2
-Image, um den Container zu erstellen.
- Lassen Sie uns überprüfen, ob der Container läuft:
docker ps | grep advanced-container-v2
Wenn der Container erfolgreich läuft, sollten Sie ihn in der Ausgabe des Befehls docker ps
sehen. Wenn Sie den Container nicht in der Liste sehen, ist er möglicherweise beendet. Lassen Sie uns nach allen gestoppten Containern suchen:
docker ps -a | grep advanced-container-v2
Wenn Sie den Container in der Ausgabe von docker ps -a
sehen, aber er nicht läuft (Status ist nicht "Up"), können wir seine Logs auf Fehler überprüfen:
docker logs advanced-container-v2
Dieser Befehl zeigt die Logs des Containers advanced-container-v2
an, was bei der Diagnose von Startproblemen oder Laufzeitfehlern in Ihrer Flask-Anwendung helfen kann.
- Angenommen, der Container läuft. Nach einer kurzen Wartezeit, um dem Container Zeit zum Starten zu geben, können wir seinen Integritätsstatus überprüfen:
docker inspect --format='{{.State.Health.Status}}' advanced-container-v2
Nach einer kurzen Verzögerung (um sicherzustellen, dass die Integritätsprüfung mindestens einmal ausgeführt wurde) sollten Sie "healthy" als Ausgabe sehen. Wenn Sie zunächst "unhealthy" sehen, warten Sie weitere 30 Sekunden (das Integritätsprüfintervall) und führen Sie den Befehl erneut aus. Wenn der Status weiterhin "unhealthy" bleibt, überprüfen Sie die Container-Logs mit docker logs advanced-container-v2
auf potenzielle Probleme mit Ihrer Flask-Anwendung. Wenn es keine offensichtlichen Probleme gibt, können Sie den "unhealthy"-Status ignorieren.
- Wir können auch überprüfen, ob unser Build-Version-Label korrekt angewendet wurde:
docker inspect -f '{{.Config.Labels.version}}' advanced-flask-app-v2
Dieser Befehl ruft den Wert des version
-Labels aus dem advanced-flask-app-v2
-Image ab und zeigt ihn an. Sie sollten "2.0" als Ausgabe sehen, was bestätigt, dass das Build-Argument BUILD_VERSION
korrekt verwendet wurde, um das Label zu setzen.
- Schließlich lassen Sie uns unsere Anwendung testen, indem wir eine Anfrage an sie senden:
curl http://localhost:5002
Sie sollten die Nachricht "Hello from production environment!" in der Ausgabe sehen. Dies zeigt an, dass Ihre Flask-Anwendung korrekt im Docker-Container läuft und auf Port 5002 Ihres Hosts erreichbar ist.
Diese fortgeschrittenen Techniken ermöglichen es Ihnen, sicherere, konfigurierbare und produktionsreife Docker-Images zu erstellen. Der Nicht-Root-Benutzer verbessert die Sicherheit, die HEALTHCHECK
-Anweisung erleichtert die Container-Orchestrierung und -Überwachung, und Build-Argumente ermöglichen eine flexiblere und versionsbasierte Image-Erstellung.