Hoy vamos a crear un contenedor Docker que nos permitirá comprimir imágenes jpg dentro de un directorio.

Comprimir imágenes es muy importante, sobre todo a la hora de montar un servicio web. Este contenedor nos permitirá tener a mano un compresor de imágenes muy pontente creado por Mozilla y agilizará el proceso de descarga de nuestros usuarios.
Lo primero que haremos es crear este Dockerfile
# Usa la imagen base de Alpine Linux
FROM alpine:latest
# Actualiza el índice de paquetes y luego instala las herramientas necesarias, incluyendo un compilador de C
RUN apk update && \
apk add --no-cache \
cmake \
autoconf \
automake \
libtool \
nasm \
make \
pkgconfig \
git \
libpng-dev \
zlib-dev \
build-base
# Clona el repositorio de MozJPEG desde GitHub
RUN git clone https://github.com/mozilla/mozjpeg.git /mozjpeg
# Cambia al directorio de trabajo de MozJPEG
WORKDIR /mozjpeg
# Configura, compila e instala MozJPEG
RUN mkdir build && cd build && \
cmake -G"Unix Makefiles" .. -DPNG_SUPPORTED=0 && \
make install
# Crea enlaces simbólicos solo si no existen previamente
RUN test -f /opt/mozjpeg/bin/cjpeg || ln -s /usr/local/bin/cjpeg /opt/mozjpeg/bin/cjpeg && \
test -f /opt/mozjpeg/bin/djpeg || ln -s /usr/local/bin/djpeg /opt/mozjpeg/bin/djpeg
# Cambia al directorio de trabajo
WORKDIR /
CMD ["tail", "-f", "/dev/null"]
Esto nos creará la imagen con la librería MozJPEG
Ahora creamos un docker-compose.yml para levantar el contenedor.
version: '3'
services:
mozjpeg:
build:
context: .
dockerfile: Dockerfile
container_name: mozjpeg-container
#tty: true
volumes:
- ${IMAGES_FOLDER}:/imagenes
Y creamos el .env que nos permitirá definir IMAGES_FOLDER
.env
IMAGES_FOLDER=./imagenes
El proyecto queda así:

Podeís crear el .gitignore:
.DS_Store .env # Ignorar archivos generados durante la construcción de la imagen .DS_Store .idea/ .vscode/ *.log *.pid *.pyc imagenes/*
Una vez creado, tendremos que ejecutarlo:
docker compose up -d
Y podemos lanzar el comando que nos comprimirá los elementos:
docker exec mozjpeg-container sh -c 'cd /imagenes && for file in *.jpg; do /opt/mozjpeg/bin/cjpeg -quality 80 "$file" > "$file.tmp" && mv "$file.tmp" "$file"; done'
En cuanto a la calidad quality 80 que se indica en el comando, podemos usar esta estrategia:
- Calidad aceptable: Para la mayoría de las imágenes en un sitio web, una calidad entre 60 y 80 es generalmente suficiente. Esto reduce el tamaño del archivo considerablemente sin una pérdida significativa en la calidad visual.
- Fotografías de alta calidad: Si tu sitio web incluye imágenes de alta calidad, como fotografías profesionales, puedes optar por una calidad más alta, entre 80 y 90. Esto conservará más detalles y colores, pero también resultará en archivos más grandes.
- Gráficos y logotipos: Para gráficos, logotipos y otros elementos visuales que contienen áreas sólidas de color y bordes nítidos, puedes usar una calidad más baja, entre 50 y 70, sin que se note mucho la pérdida de calidad.
- Prueba y optimización: Siempre es recomendable realizar pruebas y optimizaciones para encontrar el equilibrio adecuado entre calidad visual y tamaño del archivo. Puedes probar diferentes configuraciones de calidad y verificar cómo afectan al rendimiento de tu sitio web utilizando herramientas de análisis de rendimiento web.
- Compresión sin pérdida: Para imágenes que necesitan mantener la calidad original, como logotipos o ilustraciones detalladas, considera utilizar formatos de imagen con compresión sin pérdida, como PNG.
Para que la tarea de comprimir se lleve de forma periódica, se puede ejecutar mediante un cron o usando ofelia.

Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.