Ladenfotos verarbeiten

DockerBeginner
Jetzt üben

Einführung

Form & Field bereitet die nächste Ladenkollektion vor. Du hast ein Foto von Keramiktassen und eine transparente Markengrafik. Erstelle kleinere Webbilder und erhalte dabei Originale und transparenten Hintergrund. Auch nach dem Entfernen der Verarbeitungscontainer muss dein normaler Benutzer die fertigen Dateien bearbeiten können.

Docker und ein vorbereitetes ImageMagick-Werkzeugimage stehen bereit. Grundkenntnisse zu Terminal und Pfaden werden vorausgesetzt; Docker, Bind-Mounts, Bildoptionen und Shell-Syntax werden vor der Verwendung erklärt. Du installierst keine Software auf der Arbeitsstation und schreibst keinen Bildverarbeitungscode. Der Laden ist fiktiv, das Foto steht unter CC0 und die Markengrafik ist originales Lehrmaterial.

Führe Befehle in Workstation aus und prüfe und lade echte Bilder in Photo Desk herunter. Dieses Lab ist unabhängig von der Challenge. Plane etwa 55 Minuten einschließlich Lesen und gewöhnlicher Fehler ein; das ist eine Schätzung des Autors.

Ein kleines Muster verarbeiten

Du erstellst ein tatsächlich verkleinertes Foto mit einem kurzlebigen Container. Beginne in Photo Desk bei Source collection. Öffne das Foto, gehe mit Back to collection zurück und öffne die Markengrafik. Das Schachbrett dahinter kennzeichnet transparente Pixel und gehört nicht zum Bild. Kehre zur Sammlung zurück.

Bereitgestelltes Foto und transparente Grafik

Wechsle zu Workstation. Der Startordner ist /home/labex/project/photo-studio. pwd zeigt das aktuelle Verzeichnis, ls dessen Einträge. Wenn du es verlässt, kehre mit dem folgenden cd zurück; cd ändert das aktuelle Shell-Verzeichnis.

cd /home/labex/project/photo-studio
ls

Die vorbereiteten Verzeichnisse source, samples und web sind für Originale, Übungsergebnisse und endgültige Lieferung gedacht. Lasse reference.jpg unverändert: Es ist ein separates Beispiel, nicht deine Ausgabe.

Ein Image bündelt ein Programm mit seinen Abhängigkeiten. Ein Container führt dieses Image als Prozess aus. dk01-photo-tools:1 enthält ImageMagicks Programm convert. :1 bezeichnet die vorbereitete Image-Version, keinen Containernamen. docker run erstellt und startet einen Container. --rm entfernt ihn nach Prozessende. Argumente hinter dem Imagenamen werden an convert übergeben.

Frage zuerst die Version ab. -version ist eine ImageMagick-Option, keine Docker-Option:

docker run --rm dk01-photo-tools:1 -version

Erwarte ImageMagick 6.9.11-60 in der Ausgabe. Das Programm läuft im Container; convert wird dadurch nicht auf Workstation installiert.

Eingabe und Ausgabe verbinden

Ein Container hat eigene Dateisystempfade. Ein Bind-Mount stellt ein Verzeichnis der Arbeitsstation unter einem Containerpfad bereit. Verbinde für das Muster diese Verzeichnisse:

Verzeichnis der Arbeitsstation Containerpfad Zugriff
source im aktuellen Verzeichnis /input Nur Lesen
samples im aktuellen Verzeichnis /output Lesen und Schreiben

Das Verzeichnis der Arbeitsstation ist die Mount-Quelle src, der Containerpfad das Ziel dst. type=bind wählt diese Mount-Art. readonly verhindert Schreibzugriffe über diesen Eingabe-Mount. Jedes --mount beschreibt eine Verbindung. Nach /output geschriebene Ergebnisse landen in samples und bleiben nach dem Löschen des Containers erhalten.

Dateieigentümer haben numerische Kennungen. id -u zeigt deine Benutzer-ID, id -g deine Gruppen-ID:

id -u
id -g

Verwende die tatsächlichen Werte statt 1000 anzunehmen. Im nächsten Befehl führt $(...) den Befehl in Klammern aus und setzt dessen Ausgabe ein. --user "$(id -u):$(id -g)" startet das Werkzeug deshalb mit deinem numerischen Benutzer und deiner Gruppe. $PWD wird zum vollständigen aktuellen Verzeichnispfad. Doppelte Anführungszeichen halten eine Mount-Beschreibung auch bei Leerzeichen als ein Argument zusammen.

ImageMagicks -resize '320x320>' passt das Foto proportional in 320 mal 320 Pixel ein. > bedeutet nur verkleinern. Einfache Anführungszeichen reichen das Zeichen an ImageMagick weiter, statt es von der Shell als Ausgabeumleitung behandeln zu lassen. Ein Rückstrich am Zeilenende setzt denselben Befehl in der nächsten Zeile fort; kopiere den ganzen Block.

docker run --rm --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/source,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/samples,dst=/output" \
  dk01-photo-tools:1 /input/cups.jpg -resize '320x320>' /output/sample.jpg

Erfolg erzeugt normalerweise keine Ausgabe. ls -l zeigt die Datei und ihren Eigentümer:

ls -l samples/sample.jpg

Eine gewöhnliche Datei von labex ist das brauchbare Ergebnis. --rm hat den Container bereits entfernt, die eingebundene Ausgabe bleibt. Bei einem falsch geschriebenen Quellverzeichnis meldet Docker einen ungültigen Mount statt ein gültiges Foto zu erstellen. Prüfe pwd und ls source, korrigiere den Pfad und führe den Block erneut aus. Verwende weder sudo noch geänderte Verzeichnisrechte, um Pfadfehler zu verdecken.

Foto und transparente Grafik liefern

Du erstellst die endgültigen zwei Webbilder. Wähle in Photo Desk den Eintrag Your delivery. Dort stehen Formate und Grenzen, anfangs aber keine Bilder. Fehlende Ergebnisse bleiben fehlend: Die Seite ersetzt sie niemals durch Originale.

Das Tassenfoto muss ein proportionales JPEG innerhalb von 640 mal 640 Pixeln sein. Die Markengrafik muss ein PNG innerhalb von 256 mal 256 mit erhaltener Transparenz sein. Nutze jeweils die größte proportionale Größe innerhalb der Grenze und vergrößere bereits kleinere Eingaben nicht. Der Rahmen ist ein Maximum, kein quadratischer Beschnitt. Das Hochformat wird 480 mal 640, die breite Grafik 256 mal 128.

Wechsle zu Workstation. Behalte Eingabe-Mount, Identität und Werkzeug bei. Ändere nur Ausgabe-Mount zu web, Größenlimit und Ausgabename:

docker run --rm --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/source,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/web,dst=/output" \
  dk01-photo-tools:1 /input/cups.jpg -resize '640x640>' /output/cups.jpg

Verarbeite jetzt die transparente Grafik. PNG unterstützt Transparenz, JPEG nicht. Die PNG-Endung reicht nicht, wenn das Bild bereits auf einen Hintergrund reduziert wurde. Dieser Befehl erhält die ursprünglichen transparenten Pixel:

docker run --rm --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/source,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/web,dst=/output" \
  dk01-photo-tools:1 /input/brand.png -resize '256x256>' /output/brand.png

Wechsle zu Photo Desk, lade Your delivery neu und öffne beide Ergebnisse. Lies die Abmessungen und prüfe die Proportionen des Fotos. Hinter der Markengrafik muss das Schachbrett weiter durchscheinen. Nutze für jedes Ergebnis Download file, dann Back to collection. Heruntergeladen wird die Datei aus deinem Verzeichnis web.

Die fertigen beiden Webbilder

Die Oberfläche liest Dateien; sie verarbeitet und bewertet sie nicht. Ein sichtbares Bild allein beweist weder unveränderte Originale noch die Übertragbarkeit des Rezepts. Fehlt ein Bild, gehe zu Workstation zurück, prüfe Ein-/Ausgabepfade und wiederhole den passenden Befehl. Eine Seite für eine fehlende Datei unterscheidet sich von einem Verbindungsfehler zur gesamten Oberfläche.

Ein portables Rezept speichern

Speichere die zwei funktionierenden Docker-Befehle, damit eine weitere Kopie des Studioordners ihre eigenen Originale verarbeiten kann. Beginne in Workstation unter /home/labex/project/photo-studio.

Ein Shell-Skript ist eine Textdatei mit Befehlen. bash run-photos.sh lässt Bash sie der Reihe nach ausführen. Das folgende Here-Dokument schreibt die Zeilen zwischen den Markierungen RECIPE in eine Datei: cat liefert den Text, > speichert ihn und <<'RECIPE' kennzeichnet einen wörtlichen Textblock. Anführungszeichen um die erste Markierung verhindern die Expansion von $PWD und $(id ...) beim Speichern. Sie sollen erst beim Ausführen im jeweiligen Ordner ausgewertet werden. Die Abschlussmarkierung steht allein in einer Zeile.

set -e stoppt das Skript bei einem fehlgeschlagenen Werkzeugbefehl, damit spätere Befehle den Fehler nicht verdecken. Speichere das vollständige Rezept:

cat > run-photos.sh <<'RECIPE'
#!/bin/bash
set -e
docker run --rm --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/source,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/web,dst=/output" \
  dk01-photo-tools:1 /input/cups.jpg -resize '640x640>' /output/cups.jpg
docker run --rm --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/source,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/web,dst=/output" \
  dk01-photo-tools:1 /input/brand.png -resize '256x256>' /output/brand.png
RECIPE

cat ohne Umleitung zeigt eine Datei. Prüfe, dass das Rezept weiterhin wörtlich $PWD und die id-Ersetzungen enthält:

cat run-photos.sh

Führe es aus diesem Studioverzeichnis aus. Es aktualisiert bewusst dieselben zwei abgeleiteten Dateien und darf niemals Originale überschreiben:

bash run-photos.sh

Der wiederverwendbare Vertrag ist ein Ordner mit source, web und diesem Rezept. Nach dem Kopieren an einen anderen Ort, auch mit Leerzeichen im Namen, muss er eine andere kompatible Bildpaarung mit gleichen Dateinamen verarbeiten. Kleinere Originale behalten ihre Maße, statt vergrößert zu werden. Nutze gewöhnliches docker run aus PATH, ohne sudo, feste numerische UID, absoluten Arbeitsplatzpfad, Quelländerungen oder zusätzliche Host-Mounts. Containerziele dürfen abweichen, sofern dieselbe sichere Ein-/Ausgabebeziehung funktioniert. Ausführungsrechte sind nicht nötig, weil Bash die Datei aufruft.

Zeige abschließend gewöhnliche Dateinutzung. cp kopiert; mv benennt um oder verschiebt. Die folgenden zwei Befehle betreffen nur eine Kopie deines abgeleiteten Musters:

cp web/cups.jpg samples/shop-preview.jpg
mv samples/shop-preview.jpg samples/ready.jpg
ls -l samples/ready.jpg

Diese Befehle benötigen keine Administratorrechte. In web bleiben nur die zwei geforderten Dateien; Muster gehören nach samples. Plausible Dateinamen genügen nicht: Die Prüfungen dekodieren echte Bilder und führen das unveränderte Rezept mit getrennten kompatiblen Eingaben aus. Sie erzeugen deine Lieferung nicht neu.

Wechsle zu Photo Desk, lade Your delivery neu, öffne beide Ergebnisse erneut und kehre zur Sammlung zurück. Die Dateien bleiben nach dem Verschwinden sämtlicher Verarbeitungscontainer erhalten. Bewahre die gelieferten source-Dateien und reference.jpg.

Zusammenfassung

Du hast ein Docker-Image als kurzlebiges Fotowerkzeug verwendet, getrennte Ein- und Ausgabeverzeichnisse eingebunden, Originale durch einen schreibgeschützten Mount bewahrt und das Werkzeug mit deinen echten UID/GID ausgeführt. JPEG und transparentes PNG bleiben nach der Containerentfernung bearbeitbar. Das gespeicherte Rezept verarbeitet kompatible Eingaben in einem verschobenen Ordner, ohne das Werkzeug auf der Arbeitsstation zu installieren.