Введение
Marsh House отправляет Along the waterline, River edition 1, на принимающий киоск, которому недоступен реестр образов. Выставка состоит из веб-сервиса, API записей и каталога файлов коллекции. Подготовьте папку со всем необходимым для запуска именно этого выпуска в другом месте.
Вы должны знать основы сборки и запуска Docker, публикацию портов и пути в терминале. Эта работа знакомит с небольшим файлом Compose, архивами образов и переносимым набором файлов. Знания программирования и музейного дела не требуются. Docker и два образа приложения подготовлены. Записи и оригинальные схематичные иллюстрации — вымышленные учебные материалы.
Вводите команды в Workstation, а рабочий пример изучайте в Source Exhibition. Receiving Exhibition изначально пуста; вы используете эту границу поставки в следующей независимой работе. Результат этой работы — полный пакет, а не работающий получатель. Выделите около 45 минут с учётом чтения и обычных ошибок; это оценка автора.
Изучите полноценную выставку
На этом шаге вы определите, что необходимо сохранить при передаче, и сохраните точную пару образов. Начните в Source Exhibition. Страница показывает четыре предмета. Откройте Pocket compass, изучите иллюстрацию и историю и выберите Download field sheet. Будет скачана настоящая текстовая запись с выпуском, ID предмета и описанием. Используйте Back to collection, откройте Crossing ledger и скачайте также его полевой лист. Это разные предметы со своими записями и файлами.
Коллекция связывает каждый предмет с его страницей подробностей и скачиваемым полевым листом:

Переключитесь в Workstation. Она открывается в /home/labex/project/exhibition-release. pwd показывает текущую папку, ls выводит её содержимое, а cd возвращает сюда, если вы перейдёте в другое место:
cd /home/labex/project/exhibition-release
ls
compose.yaml описывает два работающих сервиса. release.json указывает этот выпуск и неизменяемые ID образов за его тегами. collection/ содержит опубликованные записи JSON, оригинальные SVG-иллюстрации и текстовые файлы для скачивания. author-notes/ содержит неопубликованные черновики и не должен входить в пакет. Сохраните все предоставленные материалы и работающие исходные сервисы без изменений.
cat показывает текстовый файл. Прочитайте запись выпуска:
cat release.json
Найдите записи web и api. Их теги — field-notes/web:pack и field-notes/api:pack; у каждой также есть ID образа, начинающийся с sha256:. Тег — имя, которое может перемещаться. ID обозначает конкретное содержимое образа. Передавайте записи выпуска вместе; один рабочий веб-образ не может предоставить записи или файлы.
mkdir создаёт каталог; -p создаёт отсутствующих родителей и допускает существующий каталог. Если packet уже существует после вашей предыдущей попытки, изучите его через ls packet и продолжайте заполнять; не удаляйте предоставленные исходные папки.
mkdir -p packet
--context default явно выбирает исходный Engine. Контекст именует соединение с демоном Docker; это не вторая физическая машина. docker image save записывает конфигурацию образов, теги и слои файловой системы. -o задаёт выходной файл. Включите оба тега выпуска в этот единый архив:
docker --context default image save -o packet/images.tar field-notes/web:pack field-notes/api:pack
Это может занять некоторое время; при успехе обычно ничего не выводится. docker container export отличается: он экспортирует файловую систему контейнера, пропускает метаданные образа и не собирает файлы bind-монтирований. Он не заменяет такую передачу образов.
Разберите связи файлов среды выполнения
На этом шаге вы сопоставите файл Compose с только что изученной выставкой и скопируете его переносимую конфигурацию. Начните в Workstation и выведите файл:
cat compose.yaml
YAML выражает связи отступами. services: содержит gallery и records. Каждое image: выбирает подготовленный образ; рецепта сборки в этом файле нет. gallery обслуживает страницы браузера и запрашивает коллекцию у records — API, читающего опубликованные материалы.
Оба сервиса используют network_mode: host: они разделяют сетевое пространство имён хоста своего Engine. Здесь веб-сервис слушает порт 9100, а API — 9101. Исходный Engine использует сеть Workstation. Принимающий Engine работает в собственном изолированном сетевом пространстве имён контейнера, поэтому те же номера там не обращаются к источнику. Это намеренно небольшая локальная учебная схема, а не общий рецепт сетевой безопасности.
API_ORIGIN — переменная окружения, именованное значение, передаваемое программе галереи. Её http://127.0.0.1:9101 указывает на API в том же пространстве имён. records.volumes связывает ./collection с /collection только для чтения, что обозначает :ro. Путь ./ отсчитывается от каталога проекта Compose, рядом с compose.yaml. Это внешняя зависимость среды выполнения: образы её не содержат.
Попросите Compose разобрать файл без запуска или изменения сервисов:
docker --context default compose config
--context default явно выбирает подготовленный исходный Engine; контекст — именованное соединение с демоном Docker, а не второй физический компьютер. В выводе относительный путь коллекции разворачивается в текущую абсолютную папку источника. Для передачи сохраните относительный путь исходного файла: копирование развёрнутого пути источника в пакет оставит зависимость от старого расположения Workstation.
Теперь полный замкнутый набор ясен: содержимое двух образов, одна конфигурация Compose и вся опубликованная коллекция. Компилятор, исходный каталог сборки, черновики и работающие исходные контейнеры не нужны для запуска полученного выпуска.
cp копирует файл; -r рекурсивно копирует каталог и его содержимое. Скопируйте исходную переносимую конфигурацию и опубликованную коллекцию:
cp compose.yaml packet/compose.yaml
Соберите переносимый пакет
На этом шаге вы дополните пакет опубликованной коллекцией и изучите его как переносимую поставку. Начните в Workstation. Создайте папку коллекции в пакете, затем рекурсивно скопируйте содержимое исходного каталога. /. означает его содержимое, поэтому повторение команды не создаёт ещё один вложенный каталог коллекции:
mkdir -p packet/collection
cp -r collection/. packet/collection/
Изучите результат:
ls packet
ls packet/collection
cat packet/compose.yaml
На верхнем уровне находятся ровно compose.yaml, images.tar и collection. Коллекция содержит exhibits.json, art/ и download/. Монтирование Compose по-прежнему начинается с ./collection, а не с абсолютного пути источника. Не копируйте author-notes или release.json в пакет среды выполнения: последний служит свидетельством выбора на стороне источника.
Наличие файла или большой архив не доказывают полноту. Проверка загружает два сохранённых образа во временное независимое хранилище образов и запускает пакет там, без сети, монтирований источника, скачивания или сборки. Она читает все записи, иллюстрации и скачиваемые байты, затем удаляет изолированные тестовые ресурсы. Она не запускает и не изменяет принимающую выставку в вашем текущем учебном окружении.
Если проверка сообщает об отсутствующем образе, ещё раз прочитайте release.json и повторите ту же команду сохранения с обоими тегами. Если отсутствует файл коллекции, сравните два вывода ls и правильно скопируйте опубликованный каталог. Если путь неверен, восстановите packet/compose.yaml из предоставленного переносимого файла. Оставьте пакет здесь для этой работы; следующая начинается со своих независимых файлов.
Резюме
Вы определили полный состав среды выполнения приложения из двух сервисов, сохранили точную пару его образов и собрали внешнюю коллекцию рядом с переносимым файлом Compose. Пакет может запускаться в независимом хранилище образов, не заимствуя каталог источника. Слои образов оказались лишь частью этого результата.



