Ausgabe
Ich betreibe eine dockerisierte Django-Sellerie-App, die einige Benutzereingaben/Daten von einer Webseite entgegennimmt und (soll) eine Unix-Binärdatei auf dem Hostsystem für die anschließende Datenanalyse ausführen (soll). Die Datenanalyse nimmt etwas Zeit in Anspruch, daher verwende ich Sellerie, um sie asynchron auszuführen. Die Datenanalysesoftware ist ebenfalls dockerisiert, daher sollte mein Django-Sellerie-Arbeiter os.system(‘docker run …’) ausführen. Sellerie sagt jedoch Docker: Befehl nicht gefunden, offensichtlich weil Docker nicht in meinem Django-Docker-Image installiert ist. Was ist die beste Lösung für dieses Problem? Ich möchte Docker nicht innerhalb von Docker ausführen, da meine Analysesoftware alle Systemressourcen verwenden darf und nicht nur die Ressourcen, die dem Django-Image zugewiesen sind.
Lösung
Ich möchte Docker nicht innerhalb von Docker ausführen, da meine Analysesoftware alle Systemressourcen verwenden darf und nicht nur die Ressourcen, die dem Django-Image zugewiesen sind.
Ich habe den kausalen Zusammenhang hier nicht verstanden. Tatsächlich müssen wir nur 2 Schritte zu Ihrem Django-Image hinzufügen:
-
Folgen Sie Client-Binärdateien unter Linux installieren , um die Docker-Client-Binärdatei von Prebuild herunterzuladen , dann enthält Ihr Django-Image den Befehl
docker
. -
Fügen Sie beim Starten des Django-Containers
/var/run/docker.sock
bind mount hinzu. Dadurch kann der Django-Container direkt mit dem Docker-Daemon auf dem Hostcomputer kommunizieren und den Datenanalyse-Tool-Container auf dem Host starten. Da der Analysecontainer nicht im Django-Container startet, können sie separate Systemressourcen haben. Mit anderen Worten, die Ressourcen des Analysecontainers hängen nicht von der Ressource des Django-Image-Containers ab.
Beispiele mit einem Docker-Image, das bereits den Docker-Client enthält:
root@pie:~# ls /dev/fuse
/dev/fuse
root@pie:~# docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock docker /bin/sh
/ # ls /dev/fuse
ls: /dev/fuse: No such file or directory
/ # docker run --rm -it -v /dev:/dev alpine ls /dev/fuse
/dev/fuse
/dev
Sie können sehen, dass der Docker-Container, dessen Befehl vom ursprünglichen Container initialisiert wurde, tatsächlich separate Ressourcen haben könnte , obwohl der ursprüngliche Container keinen Zugriff auf den Ordner des Hosts hat .
Wenn das oben Gesagte das ist, was Sie brauchen, dann ist es die richtige Lösung für Sie. Andernfalls müssen Sie das Analysetool in Ihrem Django-Image installieren
Beantwortet von – atline
Antwort geprüft von – Jay B. (FixError Admin)