Введение
Form & Field готовит новую коллекцию магазина. У вас есть фотография керамических чашек и прозрачная фирменная графика. Подготовьте уменьшенные изображения для сайта, сохранив оригиналы и прозрачный фон. После удаления контейнеров обработки обычный пользователь должен по-прежнему редактировать готовые файлы.
Docker и готовый образ с ImageMagick уже доступны. Нужны базовые навыки работы с терминалом и путями; Docker, привязанные монтирования, параметры изображений и синтаксис оболочки объясняются до применения. Устанавливать программы на рабочую станцию или писать код обработки не потребуется. Магазин вымышленный; фотография распространяется по CC0, а графика создана как оригинальный учебный материал.
Выполняйте команды в Workstation, а просматривайте и скачивайте настоящие изображения в Photo Desk. Эта работа независима от задания Challenge. Отведите около 55 минут с учётом чтения и обычных ошибок; это оценка автора.
Обработать небольшой образец
Создайте действительно уменьшенную фотографию в краткоживущем контейнере. Начните в Photo Desk на странице Source collection. Откройте фото, вернитесь через Back to collection, затем откройте фирменную графику. Шахматный фон обозначает прозрачные пиксели и не входит в само изображение. Вернитесь к коллекции.

Переключитесь в Workstation. Начальный каталог — /home/labex/project/photo-studio. pwd показывает текущий каталог, ls перечисляет его содержимое. Если вы ушли из него, вернитесь следующей командой cd; cd меняет текущий каталог оболочки.
cd /home/labex/project/photo-studio
ls
Готовые каталоги source, samples и web предназначены для оригиналов, пробного результата и окончательной поставки. Не изменяйте reference.jpg: это отдельный пример, а не ваш результат.
Образ объединяет программу с зависимостями. Контейнер запускает образ как процесс. Здесь dk01-photo-tools:1 содержит программу convert из ImageMagick. :1 обозначает версию подготовленного образа, а не имя контейнера. docker run создаёт и запускает контейнер. --rm удаляет его после завершения процесса. Аргументы после имени образа передаются в convert.
Сначала запросите версию. -version — параметр ImageMagick, а не Docker:
docker run --rm dk01-photo-tools:1 -version
В выводе ожидается ImageMagick 6.9.11-60. Программа работает внутри контейнера; convert на Workstation при этом не устанавливается.
Подключить ввод и вывод
У контейнера собственные пути файловой системы. Привязанное монтирование делает каталог рабочей станции доступным по пути контейнера. Для образца соедините эти каталоги:
| Каталог рабочей станции | Путь контейнера | Доступ |
|---|---|---|
source в текущем каталоге |
/input |
Только чтение |
samples в текущем каталоге |
/output |
Чтение и запись |
Каталог станции — это src монтирования, путь контейнера — его dst. type=bind выбирает этот тип. readonly запрещает запись во входные данные через это монтирование. Каждый --mount описывает одно соединение. Запись в /output попадает в samples и сохраняется после удаления контейнера.
У владельцев файлов есть числовые идентификаторы. id -u показывает ID пользователя, id -g — ID группы:
id -u
id -g
Используйте настоящие значения, не предполагая 1000. В следующей команде $(...) выполняет команду в скобках и подставляет её вывод. Поэтому --user "$(id -u):$(id -g)" запускает инструмент с вашими числовыми пользователем и группой. $PWD разворачивается в полный путь текущего каталога. Двойные кавычки сохраняют описание монтирования единым аргументом даже при пробелах в пути.
В ImageMagick -resize '320x320>' вписывает фото в 320 на 320 пикселей с сохранением пропорций. > означает только уменьшение. Одинарные кавычки передают символ ImageMagick, не позволяя оболочке трактовать его как перенаправление вывода. Обратная косая черта в конце строки продолжает ту же команду на следующей; копируйте весь блок.
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
При успехе обычно ничего не выводится. ls -l показывает файл и его владельца:
ls -l samples/sample.jpg
Полезный результат — обычный файл, принадлежащий labex. --rm уже удалил контейнер, но смонтированный результат остался. При опечатке в каталоге источника Docker сообщает о неверном монтировании, а не создаёт правильное фото. Посмотрите pwd и ls source, исправьте путь и повторите блок. Не используйте sudo и не меняйте права каталога, чтобы скрыть ошибку пути.
Подготовить фото и прозрачную графику
Создайте окончательную пару изображений для сайта. В Photo Desk выберите Your delivery. Здесь перечислены форматы и ограничения, но вначале изображений нет. Недостающие результаты остаются недостающими: страница никогда не подставляет оригинал.
Фото чашек должно быть JPEG в пределах 640 на 640 пикселей с сохранением пропорций. Графика — PNG в пределах 256 на 256 с прозрачностью. Используйте максимальный пропорциональный размер внутри каждой рамки, не увеличивая уже маленький входной файл. Рамка задаёт максимум, а не квадратное кадрирование. Вертикальное фото станет 480 на 640, широкая графика — 256 на 128.
Перейдите в Workstation. Сохраните входное монтирование, пользователя и инструмент. Измените только выходное монтирование на web, предел размера и имя результата:
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
Теперь обработайте прозрачную графику. PNG поддерживает прозрачность, JPEG — нет. Одного расширения PNG недостаточно, если изображение уже объединено с фоном. Эта команда сохраняет исходные прозрачные пиксели:
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
Перейдите в Photo Desk, обновите Your delivery и откройте каждый результат. Прочитайте размеры и проверьте пропорции фото. Сквозь графику должен оставаться виден шахматный фон. Для каждого результата используйте Download file, затем Back to collection. Скачивается настоящий файл из web.

Это средство просмотра, а не обработки или оценки. Видимое изображение само по себе не доказывает сохранность оригиналов и работу сценария в другой папке. Если изображения нет, вернитесь в Workstation, проверьте пути ввода/вывода и повторите нужную команду. Страница отсутствующего файла отличается от ошибки подключения ко всему Photo Desk.
Сохранить переносимый сценарий
Сохраните две работающие команды Docker, чтобы другая копия папки студии обрабатывала собственные оригиналы. Начните в Workstation, в /home/labex/project/photo-studio.
Сценарий оболочки — текстовый файл с командами. bash run-photos.sh просит Bash выполнить их по порядку. Следующий here-document записывает строки между маркерами RECIPE в файл: cat предоставляет текст, > сохраняет его, а <<'RECIPE' обозначает буквальный блок. Кавычки вокруг первого маркера предотвращают раскрытие $PWD и $(id ...) при сохранении. Они должны раскрываться позже, при выполнении в папке пользователя. Конечный маркер занимает отдельную строку.
set -e останавливает сценарий при сбое команды инструмента, чтобы последующая команда не скрыла предыдущую ошибку. Сохраните полный сценарий:
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 без перенаправления показывает файл. Убедитесь, что в сохранённом сценарии остались буквальные $PWD и подстановки id:
cat run-photos.sh
Запустите его из этой папки студии. Он намеренно обновляет те же два производных файла и никогда не должен перезаписывать оригиналы:
bash run-photos.sh
Контракт повторного использования — папка с source, web и этим сценарием. После копирования в другое место, включая имя с пробелами, он должен обработать другую совместимую пару под теми же именами. Маленькие оригиналы должны сохранять размеры, не увеличиваться. Используйте обычный docker run из PATH, без sudo, фиксированного числового UID, абсолютного пути станции, редактирования источников и дополнительных монтирований хоста. Пути назначения в контейнере могут отличаться при той же безопасной связи ввода и вывода. Право исполнения не нужно, поскольку файл запускается через Bash.
Наконец продемонстрируйте обычную работу с файлами. cp копирует, mv переименовывает или перемещает. Следующие две команды затрагивают только копию вашего производного образца:
cp web/cups.jpg samples/shop-preview.jpg
mv samples/shop-preview.jpg samples/ready.jpg
ls -l samples/ready.jpg
Права администратора не нужны. В web оставьте только два требуемых файла; образцы помещайте в samples. Правдоподобных имён недостаточно: проверки декодируют настоящие изображения и выполняют неизменённый сценарий на отдельных совместимых входных данных. Вашу поставку они не генерируют заново.
Перейдите в Photo Desk, обновите Your delivery, снова откройте оба результата и вернитесь к коллекции. Файлы остаются после исчезновения всех контейнеров обработки. Сохраните предоставленные файлы source и reference.jpg.
Резюме
Вы использовали образ Docker как одноразовый фотоинструмент, подключили отдельные каталоги ввода и вывода, защитили оригиналы монтированием только для чтения и запустили инструмент с настоящими UID/GID. JPEG и прозрачный PNG доступны для редактирования после удаления контейнера. Сохранённый сценарий обрабатывает совместимые входные файлы в перемещённой папке без установки инструмента на рабочую станцию.



