Использование MozJPEG в docker-контейнере

Feb 15, 2018 08:55 · 233 words · 2 minute read docker

Ранее мы уже упоминали о важности оптимизации и сжатия изображений перед размещением на сайте и рассматривали несколько утилит для работы с картинками.

Давайте разберемся с использованием MozJPEG в docker-контейнере!

Считаем, что docker уже установлен и корректно работает.

Прежде всего, получаем исходники утилиты MozJPEG:

git clone git://github.com/mozilla/mozjpeg.git

В этом же каталоге создадим файл Dockerfile (инструкции для сборки docker-образа) следующего содержания:

FROM alpine:3.4
COPY . /source
RUN apk —update add autoconf automake build-base libtool nasm
RUN cd /source && autoreconf -fiv && ./configure —prefix=/opt/mozjpeg && make install

Собираем docker-образ следующей командой:

docker build -t mozjpeg .

Примечание. Исходники утилиты MozJPEG можно стягивать непосредственно при сборке docker-образа, но в таком случае необходимо установить git.

После успешной сборки образа можем запустить обработку изображений в docker-контейнере с помощью команды:

docker run \
    --rm \
    -v path-to-image-dir:/img mozjpeg \
    sh -c "/opt/mozjpeg/bin/cjpeg -optimize -quality 80 /img/photo.jpg > /img/photo_small.jpg"

Параметр --rm удалит docker-контейнер после завершения обработки изображения, а с помощью ключа -v монтируем каталог path-to-image-dir с хост-машины в каталог /img в docker-контейнере.

Для обработки всех изображений в каталоге удобнее создать скрипт (как мы уже делали в предыдущем примере) optimize.sh:

#!/usr/bin/env sh

tmpfile=$(mktemp)
/opt/mozjpeg/bin/cjpeg -optimize -progressive -quality 80 -outfile ${tmpfile} ${1}
mv ${tmpfile} ${1}

Пересобираем docker-образ (чтобы скрипт оказался внутри контейнера), и тогда команда запуска docker-контейнера будет выглядеть примерно так:

docker run \
	--rm \
	-v path-to-image-dir:/img mozjpeg \
	sh -c "find . -iname *.jpg  | xargs -I % /optimize.sh %"
tweet Share