So erstellen Sie minimale Docker-Images für Python-Anwendungen
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 /stockfü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 mit pip.

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.

BasisbildBasisbild
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.



Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert