Kontinuierliche Integrationsbedenken
Kurz gesagt: Docker in Docker (dind) behandelt Parallelität nicht gut.
Der Grund, warum Sie dind nicht für CI verwenden sollten, ist, dass Docker (normalerweise /var/lib/docker
) exklusiven Zugriff auf das Verzeichnis hat, das für die Speicherung verwendet wird . Dind beachtet dies nicht, da alle untergeordneten Prozesse dieses Verzeichnis gleichzeitig verwenden. Jedes Mal, wenn Sie eine neue Version erstellen (z. B. von CI), wird möglicherweise alles, was mit Ihrer App in diesem Verzeichnis zu tun hat, gelöscht und muss bei null beginnen. Wie würde es Ihren Benutzern gefallen, wenn sie ihre Zahlungsdaten eingeben, auf "Kaufen" klicken und plötzlich wieder auf dem Anmeldebildschirm sind, als hätten sie noch nie etwas getan? Das ist einfach keine gute UX. Zwei Neuerstellungen gleichzeitig? Das wird für alle Beteiligten wirklich schlimm enden (einschließlich Ihrer Datenintegrität).
Andere Bedenken
Aus dem Link, den das OP veröffentlicht, ergeben sich Sicherheitsbedenken, da das System versucht, Sicherheitsrichtlinien in einer sehr "CSS-ähnlichen" Weise anzuwenden, bei der ein unterer Container Zugriff auf die Ressourcen eines äußeren Containers haben könnte, sofern dies nicht ausdrücklich untersagt ist. Erinnern Sie sich, wann Sie auf Webserver-Ressourcen zugreifen konnten, indem Sie etwas wie "mywebsite.com/../another_folder/private_resource.txt" ausführen? Außerdem spielen Dateisysteme manchmal nicht gut miteinander, wenn sie auf diese Weise verschachtelt sind.
Die Reparatur
Zum Glück hat der Blog-Beitrag im OP eine gute Lösung für das Problem. Sofern Ihre Anforderungen nicht durch "Docker-Container von Ihrem CI-System selbst erstellen / ausführen / pushen" erfüllt werden, können Sie den -v
Modus (Hinzufügen eines Datenvolumens zu Ihrem Container) am Docker-Socket (normalerweise /var/run/docker.sock:/var/run/docker.sock
) verwenden, um die Art der Docker-Container zuzulassen Zugriff benötigen Sie auf das "freigegebene" Datenvolumen. Diese Container werden nicht darunter, sondern neben dem übergeordneten Container gestartet, um synchrone E / A-Vorgänge zu erzwingen. Jetzt haben Sie (fast) das Gleiche wie dind, aber ohne die Nachteile, die damit verbunden sind, dass Docker nicht für die gleichzeitige Verwendung entwickelt wurde.
Referenz (von OP): Verwenden Sie Docker-in-Docker für Ihr CI oder Ihre Testumgebung? Denke nochmal nach.