Introduction
Form & Field prépare sa prochaine collection. Vous disposez d'une photo de tasses en céramique et d'un visuel de marque transparent. Produisez des images plus petites pour le Web en conservant les originaux et la transparence. Votre utilisateur ordinaire doit pouvoir modifier les fichiers après la disparition des conteneurs de traitement.
Docker et une image ImageMagick préparée sont disponibles. Vous devez connaître les bases du terminal et des chemins ; Docker, les montages liés, les options d'image et la syntaxe du shell sont expliqués avant utilisation. Vous n'installerez aucun logiciel sur le poste et n'écrirez pas de code de traitement. La boutique est fictive ; la photo est sous CC0 et le visuel est une création pédagogique originale.
Exécutez les commandes dans Workstation et consultez ou téléchargez les images réelles dans Photo Desk. Ce laboratoire est indépendant du défi. Prévoyez environ 55 minutes, lecture et erreurs courantes comprises ; il s'agit d'une estimation de l'auteur.
Traiter un petit échantillon
Vous allez créer une vraie photo réduite avec un conteneur éphémère. Dans Photo Desk, commencez par Source collection. Ouvrez la photo, revenez avec Back to collection, puis ouvrez le visuel de marque. Le damier derrière ce visuel indique les pixels transparents ; il ne fait pas partie de l'image. Revenez à la collection.

Passez à Workstation, qui démarre dans /home/labex/project/photo-studio. pwd affiche le répertoire courant et ls en liste les éléments. Si vous le quittez, revenez avec la commande cd suivante ; cd change le répertoire courant du shell.
cd /home/labex/project/photo-studio
ls
Les répertoires préparés source, samples et web servent respectivement aux originaux, à l'essai et à la livraison finale. Conservez reference.jpg intact : c'est un exemple indépendant, pas votre résultat.
Une image regroupe un programme et ses dépendances. Un conteneur exécute cette image sous forme de processus. Ici, dk01-photo-tools:1 contient le programme convert d'ImageMagick. :1 indique la version de l'image préparée, pas un nom de conteneur. docker run crée et démarre un conteneur. --rm le supprime à la fin du processus. Les arguments placés après le nom de l'image sont transmis à convert.
Demandez d'abord la version. -version est une option d'ImageMagick, pas de Docker :
docker run --rm dk01-photo-tools:1 -version
La sortie doit contenir ImageMagick 6.9.11-60. Le programme tourne dans le conteneur ; cela n'installe pas convert sur Workstation.
Relier entrée et sortie
Le conteneur possède ses propres chemins. Un montage lié rend un répertoire du poste accessible à un chemin du conteneur. Reliez ces répertoires pour l'essai :
| Répertoire du poste | Chemin du conteneur | Accès |
|---|---|---|
source dans le répertoire courant |
/input |
Lecture seule |
samples dans le répertoire courant |
/output |
Lecture et écriture |
Le répertoire du poste est le src du montage ; le chemin du conteneur est son dst. type=bind sélectionne ce montage. readonly empêche d'écrire dans l'entrée par ce montage. Chaque --mount décrit une liaison. Les résultats écrits dans /output arrivent dans samples et survivent à la suppression du conteneur.
Les propriétaires des fichiers ont aussi des identifiants numériques. id -u affiche votre identifiant utilisateur et id -g votre identifiant de groupe :
id -u
id -g
Utilisez vos valeurs réelles, sans supposer 1000. Dans la commande suivante, $(...) exécute la commande entre parenthèses et insère sa sortie. Ainsi, --user "$(id -u):$(id -g)" lance l'outil avec votre utilisateur et groupe numériques. $PWD devient le chemin complet du répertoire courant. Les guillemets doubles gardent la description du montage en un seul argument même si le chemin comporte des espaces.
Pour ImageMagick, -resize '320x320>' inscrit la photo dans 320 par 320 pixels en gardant ses proportions. > signifie réduire uniquement. Les apostrophes transmettent ce caractère à ImageMagick au lieu de laisser le shell l'interpréter comme une redirection de sortie. Une barre oblique inverse en fin de ligne prolonge la même commande ; copiez le bloc entier.
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
En cas de réussite, rien ne s'affiche généralement. ls -l montre le fichier créé et son propriétaire :
ls -l samples/sample.jpg
Le résultat utile est un fichier ordinaire appartenant à labex. --rm a déjà supprimé le conteneur, mais la sortie montée reste. Si le répertoire source est mal orthographié, Docker signale un montage invalide sans produire de photo valide. Consultez pwd et ls source, corrigez le chemin et relancez le bloc. N'utilisez pas sudo et ne changez pas les permissions pour masquer une erreur de chemin.
Livrer la photo et le visuel transparent
Vous allez créer les deux images Web finales. Dans Photo Desk, sélectionnez Your delivery. Les formats et limites y figurent, mais aucune image n'est présente au départ. Les résultats absents restent absents : la page n'emprunte jamais un original pour combler un manque.
La photo des tasses doit être un JPEG de 640 par 640 pixels au maximum, aux proportions conservées. Le visuel doit être un PNG de 256 par 256 au maximum, transparent. Utilisez la plus grande taille proportionnelle dans chaque cadre, sans agrandir une entrée déjà petite. Le cadre est un maximum, pas un recadrage carré. La photo verticale devient 480 par 640 ; le visuel large, 256 par 128.
Passez à Workstation. Réutilisez le montage d'entrée, l'identité et l'outil. Changez seulement le montage de sortie en web, la limite et le nom :
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
Traitez maintenant le visuel. PNG accepte la transparence, JPEG non. Garder l'extension PNG ne suffit pas si l'image a déjà été aplatie sur un fond. Cette commande conserve les pixels transparents d'origine :
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
Passez à Photo Desk, rechargez Your delivery et ouvrez chaque résultat. Lisez les dimensions et observez les proportions. Le damier doit encore apparaître à travers le visuel. Utilisez Download file pour chacun, puis Back to collection. Le téléchargement est le fichier réel du répertoire web.

Le bureau est un lecteur, pas un processeur ni un correcteur. Une image visible ne prouve pas, à elle seule, que les originaux sont intacts ou que la recette fonctionne ailleurs. Si une image manque, revenez à Workstation, vérifiez les chemins et relancez la commande correspondante. Une page de fichier manquant se distingue d'un échec de connexion à l'ensemble du bureau.
Conserver une recette portable
Vous allez enregistrer les deux commandes Docker qui fonctionnent pour qu'une autre copie du dossier traite ses propres originaux. Commencez dans Workstation, dans /home/labex/project/photo-studio.
Un script shell est un fichier texte contenant des commandes. bash run-photos.sh demande à Bash de les exécuter dans l'ordre. Le here-document suivant écrit les lignes entre les marqueurs RECIPE dans un fichier : cat fournit le texte, > l'enregistre et <<'RECIPE' définit un bloc littéral. Les apostrophes du premier marqueur empêchent l'expansion de $PWD et de $(id ...) pendant l'enregistrement. Ces expressions doivent être évaluées plus tard, dans le dossier de la personne qui exécute le script. Le marqueur final reste seul sur sa ligne.
set -e arrête le script lorsqu'une commande de l'outil échoue, pour qu'une commande ultérieure ne masque pas cet échec. Enregistrez la recette complète :
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 sans redirection affiche un fichier. Vérifiez que la recette contient toujours littéralement $PWD et les substitutions id :
cat run-photos.sh
Exécutez-la depuis ce dossier. Elle actualise volontairement les deux mêmes fichiers dérivés, sans jamais réécrire les originaux :
bash run-photos.sh
Le contrat réutilisable est un dossier contenant source, web et cette recette. Il doit traiter d'autres images compatibles portant les mêmes noms après copie ailleurs, y compris dans un dossier avec des espaces. Les originaux plus petits doivent garder leurs dimensions, sans agrandissement. Utilisez docker run ordinaire dans PATH, sans sudo, UID numérique fixe, chemin absolu du poste, modification des sources ou montage hôte supplémentaire. Les destinations du conteneur peuvent différer si la même relation sûre est conservée. Aucun droit d'exécution n'est nécessaire puisque Bash ouvre le fichier.
Démontrez enfin l'utilisation ordinaire des fichiers. cp copie ; mv renomme ou déplace. Les deux commandes suivantes ne concernent qu'une copie de votre échantillon dérivé :
cp web/cups.jpg samples/shop-preview.jpg
mv samples/shop-preview.jpg samples/ready.jpg
ls -l samples/ready.jpg
Ces commandes n'exigent aucun accès administrateur. Gardez uniquement les deux fichiers demandés dans web ; les essais vont dans samples. Des noms plausibles ne suffisent pas : les contrôles décodent les images et exécutent la recette inchangée sur des entrées compatibles distinctes. Ils ne régénèrent pas votre livraison.
Passez à Photo Desk, rechargez Your delivery, ouvrez encore les deux résultats et revenez à la collection. Les fichiers existent toujours après la disparition de tous les conteneurs de traitement. Conservez les fichiers source et reference.jpg fournis.
Résumé
Vous avez utilisé une image Docker comme outil photo jetable, associé des répertoires d'entrée et de sortie distincts, protégé les originaux par un montage en lecture seule et exécuté l'outil avec vos véritables UID/GID. Le JPEG et le PNG transparent restent modifiables après suppression du conteneur. La recette enregistrée traite des entrées compatibles dans un dossier déplacé, sans installer l'outil sur le poste.



