Wir entwickeln eine App, die vor Ort für verschiedene Installationen (nicht für die Cloud) bereitgestellt werden soll. Unser OEM-Partner bittet uns, ihnen eine ISO zur Verfügung zu stellen, damit wir schnell neue Server bereitstellen können. Unsere App basiert auf Containern und wir haben ein privates Registrierungs-Setup für das Internet, um die neuesten Builds abrufen zu können. Ich bin mir noch nicht sicher, ob der OEM-Partner diese Bilder selbst abrufen kann. Daher prüfen wir die Möglichkeit, die Docker-Bilder zusammen mit der ISO vorab zu verpacken, haben jedoch einige Schwierigkeiten. Einige Dinge, die wir versucht haben:
Systemback - Wir haben versucht, eine neue Ubuntu-Installation mit unserem bevorzugten Setup (wie durch eine Ansible-Rolle definiert) bereitzustellen und das Ergebnis dann mit Systemback zu erfassen. Bei der Neuinstallation der resultierenden ISO wird ein Docker-Fehler angezeigt :
Error response from daemon: open /var/lib/docker/aufs/layers/blahblahblah: no such file or directory
ähnlich wie bei # 22343chroot jail - Wir haben erneut versucht, unseren Benutzer zu erstellen und Docker zu installieren, aber beim Versuch, unsere Bilder abzurufen, werden wir begrüßt:
failed to register layer: Error processing tar file(exit status 1): invalid argument
unabhängig davon, welches Bild wir abrufen (zum Beispiel sogar ein offizielles Docker-Ubuntu-Bild). Google hilft bei diesem Fehler nicht weiter.RancherOS - Hier haben wir Anweisungen zum Vorverpacken von Docker-Bildern gefunden, aber nicht zum Bündeln mit der ISO . Es sieht so aus, als hätten wir den gleichen Anwendungsfall wie # 1449, aber es gibt keine wirkliche Lösung.
Jetzt kann ich nur noch versuchen, als nächstes docker save
unsere Bilder zu versuchen und die Tarballs in die ISO aufzunehmen. Führen Sie dann beim ersten Starten der ISO ein Skript aus, um zu überprüfen, ob die Docker-Bilder vorhanden sind oder nicht, und wenn nicht, führen Sie docker load
jeweils ein und aus Führen Sie sie dann aus, obwohl dies extrem hackig und unzuverlässig erscheint. Ich habe mich gefragt, ob jemand Erfahrung mit solchen Dingen hat und mich möglicherweise in die richtige Richtung weisen kann.
quelle
docker load
ist , wofür es ist.Antworten:
@ Michael Hampton 's Antwort scheint mir ungefähr richtig zu sein.
Was ich vorschlagen würde, ist, dass Sie die relevanten systemd-Skripte in Ihre ISO packen und diese Skripte mit dem Laden oder Erstellen Ihrer Bilder befassen.
Zum Beispiel könnte Ihre Unit-Datei wie ein Nginx-Container aussehen:
Wenn Sie lieber bauen als laden möchten, können Sie dies auch tun, indem Sie Folgendes ersetzen:
ExecStartPre=-/usr/bin/docker load /path/to/compressed/image
Mit:
ExecStartPre=-/usr/bin/docker build --rm -t 'my-nginx:latest' /path/to/folder_with_Dockerfile
Sie können auch systemd-Abhängigkeiten verwenden, um sicherzustellen, dass das Objekt in der richtigen Reihenfolge gestartet wird, und / oder Container miteinander verknüpfen (siehe z. B. systemd
After
/Before
,PartOf
usw.).Im Allgemeinen denke ich nicht, dass ich zu viel Zeit damit verbringen würde, mir Gedanken darüber zu machen, nur einmal zu laden / erstellen - insbesondere wenn Sie Bilder erstellen (anstatt sie zu laden), können Sie einen Container aktualisieren, indem Sie seine lokale Docker-Datei aktualisieren . Dies kann eine nützliche Funktion sein, wenn Ihre Registrierung nicht verfügbar ist.
quelle
Sie können dies tun, indem Sie einen
/var/lib/docker
Baum vorinstallieren . Dieses Verzeichnis enthält alle Bilder, Container usw., die in einer Docker-Umgebung vorhanden sind. Sie sollten also von einem sauberen Verzeichnis ausgehen, um/var/lib/docker
nur die gewünschten Bilder usw. zu erstellen . Wenn Docker gestartet wird, wird das verwendet vorhandene Verzeichnisstruktur, in der die Images bereits vorinstalliert sind.quelle