Bild vom Herausgeber | Midjourney & Canva
Das Erstellen minimaler Docker-Pictures für Python-Apps erhöht die Sicherheit durch Reduzierung der Angriffsfläche, ermöglicht schnellere Picture-Erstellung und verbessert die allgemeine Wartbarkeit der Anwendung. Erfahren Sie, wie Sie minimale Docker-Pictures für Python-Anwendungen erstellen.
Voraussetzungen
Bevor Sie beginnen:
- Sie sollten Docker installiert haben. Docker herunterladen für Ihr Betriebssystem, falls Sie dies nicht bereits getan haben.
- Eine Python-Beispielanwendung, für die Sie das minimale Picture erstellen müssen. Sie können auch den Beispiel-App Wir erstellen.
Erstellen einer Python-Beispielanwendung
Lassen Sie uns eine einfache Flask-Anwendung für die Bestandsverwaltung erstellen. Mit dieser Anwendung können Sie Bestandsartikel hinzufügen, anzeigen, aktualisieren und löschen. Anschließend docken wir die Anwendung mit dem Normal-Python-3.11-Picture an.
In Ihrem Projektverzeichnis sollten sich app.py, necessities.txt und Dockerfile befinden:
inventory_app/
├── app.py
├── Dockerfile
├── necessities.txt
Hier ist der Code für die Flask-App zur Bestandsverwaltung:
# app.py
from flask import Flask, request, jsonify
app = Flask(__name__)
# In-memory database for simplicity
stock = {}
@app.route('/stock', strategies=('POST'))
def add_item():
merchandise = request.get_json()
item_id = merchandise.get('id')
if not item_id:
return jsonify({"error": "Merchandise ID is required"}), 400
if item_id in stock:
return jsonify({"error": "Merchandise already exists"}), 400
stock(item_id) = merchandise
return jsonify(merchandise), 201
@app.route('/stock/', strategies=('GET'))
def get_item(item_id):
merchandise = stock.get(item_id)
if not merchandise:
return jsonify({"error": "Merchandise not discovered"}), 404
return jsonify(merchandise)
@app.route('/stock/', strategies=('PUT'))
def update_item(item_id):
if item_id not in stock:
return jsonify({"error": "Merchandise not discovered"}), 404
updated_item = request.get_json()
stock(item_id) = updated_item
return jsonify(updated_item)
@app.route('/stock/', strategies=('DELETE'))
def delete_item(item_id):
if item_id not in stock:
return jsonify({"error": "Merchandise not discovered"}), 404
del stock(item_id)
return '', 204
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000)
Dies ist eine minimale Flask-Anwendung, die grundlegende CRUD-Operationen (Erstellen, Lesen, Aktualisieren, Löschen) für eine In-Reminiscence-Inventardatenbank implementiert. Sie verwendet Flask, um einen Webserver zu erstellen, der auf Port 5000 auf HTTP-Anfragen wartet. Wenn eine Anfrage empfangen wird:
- Für eine POST-Anfrage an
/stock
fügt es dem Inventar einen neuen Gegenstand hinzu. - Für eine GET-Anfrage an
/stock/<item_id>
ruft es den Artikel mit der angegebenen ID aus dem Inventar ab. - Für eine PUT-Anforderung an
/stock/<item_id>
aktualisiert es den Artikel mit der angegebenen ID im Inventar. - Für eine DELETE-Anforderung an
/stock/<item_id>
löscht es den Artikel mit der angegebenen ID aus dem Inventar.
Erstellen Sie nun die Datei necessities.txt:
Erstellen Sie als Nächstes die Docker-Datei:
# Use the official Python 3.11 picture
FROM python:3.11
# Set the working listing
WORKDIR /app
# Set up dependencies
COPY necessities.txt necessities.txt
RUN pip set up --no-cache-dir -r necessities.txt
# Copy the present listing contents into the container at /app
COPY . .
# Expose the port the app runs on
EXPOSE 5000
# Run the applying
CMD ("python3", "app.py")
Zum Schluss das Picture erstellen (wir verwenden das Tag full
um zu erkennen, dass das Normal-Python-Picture verwendet wird):
$ docker construct -t inventory-app:full .
Sobald der Construct abgeschlossen ist, können Sie den docker pictures
Befehl:
$ docker pictures
REPOSITORY TAG IMAGE ID CREATED SIZE
inventory-app full 4e623743f556 2 hours in the past 1.02GB
Sie werden sehen, dass diese tremendous einfache App etwa 1,02 GB groß ist. Das liegt daran, dass das von uns verwendete Basisimage, das Standardimage Python 3.11, eine große Anzahl von Debian-Paketen enthält und etwa 1,01 GB groß ist. Wir müssen additionally ein kleineres Basisbild finden.
Hier sind die Optionen:
python:version-alpine
Pictures basieren auf Alpine Linux und liefern Ihnen das kleinste Endimage. Sie müssen aber auch Pakete installieren können, oder? Bei Alpine-Pictures ist das jedoch eine Herausforderung.python:version-slim
kommt mit der minimalen Anzahl an Debian-Paketen, die zum Ausführen von Python erforderlich sind. Und Sie können (quick immer) die meisten erforderlichen Python-Pakete installieren mitpip
.
Ihr Foundation-Picture sollte additionally klein sein. Aber nicht zu klein, damit Sie keine Kompatibilitätsprobleme bekommen und sich mit der Set up von Abhängigkeiten herumschlagen müssen (was bei Python-Anwendungen recht häufig vorkommt). Deshalb verwenden wir das python:3.11-slim
Foundation-Picture im nächsten Schritt und erstellen Sie unser Picture.
Auswahl des optimalen Basisbilds | Bild vom Autor
Verwenden Sie das Slim Python-Basisimage
Schreiben Sie nun das Dockerfile neu, um das python:3.11-slim
Basisbild wie folgt:
# Use the official light-weight Python 3.11-slim picture
FROM python:3.11-slim
# Set the working listing
WORKDIR /app
# Set up dependencies
COPY necessities.txt necessities.txt
RUN pip set up --no-cache-dir -r necessities.txt
# Copy the present listing contents into the container at /app
COPY . .
# Expose the port the app runs on
EXPOSE 5000
# Run the applying
CMD ("python3", "app.py")
Lassen Sie uns das Bild erstellen (getaggt slim
):
$ docker construct -t inventory-app:slim .
Der python:3.11-slim
Das Foundation-Picture hat eine Größe von 131 MB. Und das inventory-app:slim
Das Bild ist etwa 146 MB groß und damit viel kleiner als das 1,02 GB große Bild, das wir vorher hatten:
$ docker pictures
REPOSITORY TAG IMAGE ID CREATED SIZE
inventory-app slim 32784c60a992 About an hour in the past 146MB
inventory-app full 4e623743f556 2 hours in the past 1.02GB
Sie können auch mehrstufige Builds verwenden, um das endgültige Picture zu verkleinern. Aber das ist Thema eines anderen Tutorials!
Zusätzliche Ressourcen
Hier sind einige nützliche Ressourcen:
Bala Priya C ist Entwicklerin und technische Redakteurin aus Indien. Sie arbeitet gerne an der Schnittstelle zwischen Mathematik, Programmierung, Datenwissenschaft und Inhaltserstellung. Ihre Interessens- und Fachgebiete umfassen DevOps, Datenwissenschaft und Verarbeitung natürlicher Sprache. Sie liest, schreibt, programmiert und trinkt gerne Kaffee! Derzeit arbeitet sie daran, ihr Wissen zu lernen und mit der Entwickler-Group zu teilen, indem sie Tutorials, Anleitungen, Meinungsbeiträge und mehr verfasst. Bala erstellt auch ansprechende Ressourcenübersichten und Programmier-Tutorials.