Назад | Перейти на главную страницу

Предварительная загрузка образов докеров с ISO для распространения

Мы разрабатываем приложение, которое будет развернуто на месте для различных установок (не в облаке). Наш OEM-партнер просит нас предоставить им ISO, чтобы иметь возможность быстро предоставлять новые серверы. Наше приложение построено на контейнерах, и у нас есть личный доступ к Интернету, чтобы иметь возможность загружать последние проходящие сборки. Я еще не уверен, сможет ли OEM-партнер получить эти образы самостоятельно, поэтому мы изучаем возможность предварительной упаковки образов докеров вместе с ISO, но испытываем некоторые трудности. Некоторые вещи, которые мы пробовали:

  1. systemback - Мы попытались подготовить новую установку ubuntu с нашей предпочтительной настройкой (как определено имеющейся у нас доступной ролью), а затем получить результат с помощью systemback. При повторной установке полученного ISO мы встречаемся с ошибкой докера: Error response from daemon: open /var/lib/docker/aufs/layers/blahblahblah: no such file or directory похожий на # 22343

  2. chroot jail - Опять же, мы попытались создать нашего пользователя, установив докер, но при попытке вытащить наши образы нас встречают: failed to register layer: Error processing tar file(exit status 1): invalid argument независимо от того, какой образ мы извлекаем (даже официальный образ docker ubuntu, например). Google не может помочь с этой ошибкой.

  3. RancherOS - Здесь мы нашли инструкции по предварительно упаковать образы докеров но не как связать их с iso. Похоже, у нас тот же вариант использования, что и # 1449 но настоящего решения нет.

Теперь все, что я могу придумать, - это попробовать docker save наши образы и включают архивы с ISO, затем при первом запуске iso запустите скрипт, чтобы проверить, существуют ли образы докеров или нет, и если они не существуют, выполните docker load на каждом, а затем запускать их, хотя это кажется чрезвычайно хакерским и ненадежным, поэтому мне было интересно, есть ли у кого-нибудь опыт работы с подобными вещами и может ли он указать мне в правильном направлении.

Вы можете сделать это, предварительно установив /var/lib/docker дерево. Этот каталог содержит все изображения, контейнеры и т. Д., Которые присутствуют в среде докеров, поэтому вы захотите начать с чистого, чтобы создать свой /var/lib/docker содержащие только желаемые изображения и т. д. Когда докер запускается, он будет использовать существующую структуру каталогов, в которой уже есть предварительно установленные изображения.

@Майкл ХэмптонОтвет кажется мне правильным.

Я бы посоветовал вам упаковать соответствующие скрипты systemd в свой ISO-образ и поручить этим скриптам загружать или создавать ваши изображения.

Итак, например, для контейнера nginx, ваш файл модуля может выглядеть так:

[Unit]
Description=nginx
After=docker.service
Requires=docker.service


[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill nginx
ExecStartPre=-/usr/bin/docker rm nginx
ExecStartPre=-/usr/bin/docker load /path/to/compressed/image
ExecStart=/usr/bin/docker run --rm [your config here]

Если вы предпочитаете сборку, а не загрузку, вы также можете сделать это, заменив:

ExecStartPre=-/usr/bin/docker load /path/to/compressed/image

С участием:

ExecStartPre=-/usr/bin/docker build --rm -t 'my-nginx:latest' /path/to/folder_with_Dockerfile

Вы также можете использовать зависимости systemd, чтобы убедиться, что все запускается в правильном порядке, и / или связывать контейнеры вместе (см., Например, systemd After/Before, PartOf, и так далее).

В общем, я не думаю, что тратил бы слишком много времени, беспокоясь о загрузке / сборке только один раз - особенно если вы собирались создавать образы (а не загружать их), это позволило бы вам обновить контейнер, обновив его локальный файл Docker . Это может быть полезно, если ваш реестр будет недоступен.