Procesar las fotos de la tienda

DockerBeginner
Practicar Ahora

Introducción

Form & Field prepara su próxima colección. Tienes una fotografía de tazas de cerámica y una imagen de marca transparente. Crea versiones pequeñas para la web conservando los originales y el fondo transparente. Tu usuario normal debe poder editar los archivos cuando desaparezcan los contenedores de procesamiento.

Docker y una imagen preparada con ImageMagick están listos. Necesitas conocimientos básicos de terminal y rutas; se explican Docker, los bind mounts, las opciones de imagen y la sintaxis del shell antes de usarlos. No instalarás programas en la estación ni escribirás código de procesamiento. La tienda es ficticia; la foto es CC0 y el diseño de marca es material didáctico original.

Ejecuta los comandos en Workstation y examina y descarga las imágenes reales en Photo Desk. Este laboratorio es independiente del desafío. Reserva unos 55 minutos, incluida la lectura y los errores habituales; es una estimación del autor.

Procesar una muestra pequeña

Crearás una fotografía realmente reducida con un contenedor de corta duración. Empieza en Photo Desk, en Source collection. Abre la foto, vuelve con Back to collection y abre el diseño de marca. El damero detrás del diseño indica píxeles transparentes; no forma parte de la imagen. Vuelve a la colección.

Fotografía y diseño transparente proporcionados

Cambia a Workstation, que comienza en /home/labex/project/photo-studio. pwd muestra el directorio actual y ls enumera su contenido. Si sales de él, vuelve con el siguiente comando cd; cd cambia el directorio actual del shell.

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

Los directorios preparados source, samples y web contienen, respectivamente, originales, una práctica y la entrega final. Conserva reference.jpg sin cambios: es una muestra independiente, no tu salida.

Una imagen empaqueta un programa y sus dependencias. Un contenedor ejecuta esa imagen como proceso. dk01-photo-tools:1 contiene el programa convert de ImageMagick. :1 identifica la versión preparada de la imagen, no un contenedor. docker run crea e inicia un contenedor; --rm lo elimina al terminar el proceso. Los argumentos posteriores al nombre de la imagen se pasan a convert.

Consulta primero la versión. -version es una opción de ImageMagick, no de Docker:

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

La salida debe incluir ImageMagick 6.9.11-60. El programa se ejecuta dentro del contenedor y no instala convert en Workstation.

Conectar la entrada y la salida

El contenedor tiene sus propias rutas. Un bind mount hace accesible un directorio de la estación en una ruta del contenedor. Conecta estos directorios para la muestra:

Directorio de la estación Ruta del contenedor Acceso
source del directorio actual /input Solo lectura
samples del directorio actual /output Lectura y escritura

El directorio de la estación es el src del montaje; la ruta del contenedor es su dst. type=bind selecciona este montaje. readonly impide escribir en la entrada mediante él. Cada --mount describe una conexión. La salida escrita en /output llega a samples y sobrevive a la eliminación del contenedor.

Los propietarios de los archivos también tienen números. id -u muestra tu ID de usuario e id -g tu ID de grupo:

id -u
id -g

Usa los valores reales, sin suponer 1000. En el siguiente comando, $(...) ejecuta lo que está entre paréntesis e inserta su salida. Así, --user "$(id -u):$(id -g)" ejecuta la herramienta con tu usuario y grupo numéricos. $PWD se expande a la ruta completa del directorio actual. Las comillas dobles mantienen unida la descripción del montaje incluso si contiene espacios.

En ImageMagick, -resize '320x320>' ajusta la foto dentro de 320 por 320 píxeles conservando proporciones. > significa reducir solamente. Las comillas simples lo pasan a ImageMagick en vez de dejar que el shell lo interprete como redirección de salida. Una barra inversa al final de línea continúa el comando en la siguiente; copia el bloque completo.

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

Normalmente no hay salida si funciona. ls -l muestra el archivo y su propietario:

ls -l samples/sample.jpg

El resultado útil es un archivo normal de labex. --rm ya eliminó el contenedor, pero la salida montada permanece. Si escribes mal el directorio fuente, Docker informa de un montaje no válido, no crea una foto válida. Revisa pwd y ls source, corrige la ruta y repite el bloque. No uses sudo ni cambies permisos para ocultar un error de ruta.

Entregar la foto y el diseño transparente

Crearás las dos imágenes web finales. Empieza en Photo Desk y selecciona Your delivery. Allí aparecen formatos y límites, pero inicialmente no hay imágenes. Los resultados ausentes siguen ausentes: la página nunca los sustituye por originales.

La foto de las tazas debe ser JPEG dentro de 640 por 640 píxeles, con sus proporciones. La marca debe ser PNG dentro de 256 por 256, con transparencia. Usa el mayor tamaño proporcional dentro de cada límite, sin ampliar entradas ya pequeñas. El cuadro marca un máximo, no un recorte cuadrado. La foto vertical queda en 480 por 640; el diseño horizontal, en 256 por 128.

Cambia a Workstation. Reutiliza entrada, identidad y herramienta; cambia solo el montaje de salida a web, el límite y el nombre:

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

Procesa ahora el diseño transparente. PNG admite transparencia; JPEG no. Conservar la extensión PNG no basta si la imagen ya se aplanó sobre un fondo. Este comando conserva los píxeles transparentes originales:

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

Cambia a Photo Desk, recarga Your delivery y abre cada resultado. Lee las dimensiones y examina las proporciones. El damero debe verse a través de la marca. Usa Download file en cada resultado y vuelve con Back to collection. Descargas el archivo real de web.

Las dos imágenes web terminadas

La página es un lector, no un procesador ni un evaluador. Ver una imagen no demuestra por sí solo que los originales estén intactos o que la receta funcione en otra carpeta. Si falta una imagen, vuelve a Workstation, revisa las rutas y repite el comando correspondiente. Una página de archivo ausente es distinta de un fallo de conexión con todo el lector.

Guardar una receta portátil

Guardarás los dos comandos Docker que funcionan para que otra copia de la carpeta procese sus propios originales. Empieza en Workstation, en /home/labex/project/photo-studio.

Un script de shell es un archivo de texto con comandos. bash run-photos.sh pide a Bash ejecutarlos en orden. Este here-document escribe en un archivo las líneas entre los marcadores RECIPE: cat aporta el texto, > lo guarda y <<'RECIPE' delimita un bloque literal. Las comillas del primer marcador impiden expandir $PWD y $(id ...) al guardar. Deben expandirse después, al ejecutar en la carpeta del destinatario. El marcador final ocupa su propia línea.

set -e detiene el script si falla un comando de herramienta, para que uno posterior no oculte el fallo. Guarda la receta completa:

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 sin redirección muestra un archivo. Comprueba que la receta conserva literalmente $PWD y las sustituciones id:

cat run-photos.sh

Ejecútala desde esta carpeta. Actualiza intencionadamente los mismos dos archivos derivados; nunca debe reescribir originales:

bash run-photos.sh

El contrato reutilizable es una carpeta con source, web y esta receta. Debe procesar otra pareja compatible con los mismos nombres al copiar la carpeta a otro lugar, incluso con espacios en su nombre. Los originales pequeños deben conservar dimensiones, sin ampliarse. Usa docker run normal en PATH, sin sudo, UID fijo, ruta absoluta de la estación, edición de fuentes ni montajes adicionales del host. Los destinos del contenedor pueden variar si mantienen la misma relación segura. No necesitas permiso de ejecución porque invocas el archivo con Bash.

Prueba por último el uso normal de archivos. cp copia; mv cambia el nombre o mueve. Los dos comandos siguientes afectan solo a una copia de tu muestra derivada:

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

No necesitan acceso de administrador. Deja solo los dos archivos pedidos en web; las muestras van en samples. Un conjunto de nombres plausibles no basta: los controles decodifican las imágenes y ejecutan la receta intacta con entradas compatibles independientes. No regeneran tu entrega.

Cambia a Photo Desk, recarga Your delivery, vuelve a abrir ambos resultados y regresa a la colección. Los archivos siguen ahí aunque todos los contenedores de procesamiento hayan desaparecido. Conserva los archivos source y reference.jpg suministrados.

Resumen

Usaste una imagen Docker como herramienta desechable, asignaste directorios de entrada y salida separados, protegiste los originales con un montaje de solo lectura y ejecutaste la herramienta con tu UID/GID real. El JPEG y el PNG transparente siguen siendo editables tras eliminar el contenedor. La receta guardada procesa entradas compatibles en una carpeta trasladada sin instalar la herramienta en la estación.