Мы разрабатываем приложение, которое будет развернуто на месте для различных установок (не в облаке). Наш OEM-партнер просит нас предоставить им ISO, чтобы иметь возможность быстро предоставлять новые серверы. Наше приложение построено на контейнерах, и у нас есть личный доступ к Интернету, чтобы иметь возможность загружать последние проходящие сборки. Я еще не уверен, сможет ли OEM-партнер получить эти образы самостоятельно, поэтому мы изучаем возможность предварительной упаковки образов докеров вместе с ISO, но испытываем некоторые трудности. Некоторые вещи, которые мы пробовали:
systemback - Мы попытались подготовить новую установку ubuntu с нашей предпочтительной настройкой (как определено имеющейся у нас доступной ролью), а затем получить результат с помощью systemback. При повторной установке полученного ISO мы встречаемся с ошибкой докера: Error response from daemon: open /var/lib/docker/aufs/layers/blahblahblah: no such file or directory
похожий на # 22343
chroot jail - Опять же, мы попытались создать нашего пользователя, установив докер, но при попытке вытащить наши образы нас встречают: failed to register layer: Error processing tar file(exit status 1): invalid argument
независимо от того, какой образ мы извлекаем (даже официальный образ docker ubuntu, например). Google не может помочь с этой ошибкой.
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 . Это может быть полезно, если ваш реестр будет недоступен.