Vorladen von Docker-Bildern mit einer ISO zur Umverteilung

8

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:

  1. 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 # 22343

  2. chroot 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 argumentunabhängig davon, welches Bild wir abrufen (zum Beispiel sogar ein offizielles Docker-Ubuntu-Bild). Google hilft bei diesem Fehler nicht weiter.

  3. 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 saveunsere 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 loadjeweils 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.

DTI-Matt
quelle
1
Ich wünschte, ich hätte eine längere Antwort, aber ich denke, was Sie vorschlagen, scheint die am besten geeignete Option zu sein, obwohl ich versucht wäre, Puppe oder Koch auch mit der ISO zu bündeln, damit Sie nach Bedarf erneut ziehen können.
Chopper3
3
Ich bin mir nicht sicher, warum du denkst, "das scheint extrem hackig", da es genau das docker loadist , wofür es ist.
Michael Hampton
1
@MichaelHampton Ja, fair, der hackige Teil besteht eher darin, ein erstes Boot-Skript zu haben, das die Images lädt und sich dann selbst entfernt und außerdem systemd-Skripte hinzufügt, um die Container bei allen nachfolgenden Booten automatisch zu starten. Wenn also die Images / Systemd-Skripte in die ISO aufgenommen werden könnten, würde dies die Unsicherheit / Abhängigkeit von Skripten beseitigen.
DTI-Matt
Hat @MichaelHampton Ihre Frage beantwortet? Wenn nicht, welche Antworten haben Sie noch?
030

Antworten:

0

@ 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:

[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]

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, PartOfusw.).

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.

Ich wurde von der Wahrheit gegessen
quelle
0

Sie können dies tun, indem Sie einen /var/lib/dockerBaum 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/dockernur die gewünschten Bilder usw. zu erstellen . Wenn Docker gestartet wird, wird das verwendet vorhandene Verzeichnisstruktur, in der die Images bereits vorinstalliert sind.

Matt Zimmerman
quelle