Ich habe gerade ein paar Dockerfiles.
Eine ist für Cassandra 3.5 und es ist FROM cassandra:3.5
Ich habe auch eine Docker-Datei für Kafka, aber es ist ziemlich viel komplexer. Es ist FROM java:openjdk-8-fre
und es führt einen langen Befehl aus, um Kafka und Zookeeper zu installieren.
Schließlich habe ich eine Anwendung in Scala geschrieben, die SBT verwendet.
Für diese Docker-Datei bekomme FROM broadinstitute/scala-baseimage
ich Java 8, Scala 2.11.7 und STB 0.13.9, die ich brauche.
Vielleicht verstehe ich nicht, wie Docker funktioniert, aber mein Scala-Programm hat Cassandra und Kafka als Abhängigkeiten und für Entwicklungszwecke möchte ich, dass andere mein Repo einfach mit dem klonen Dockerfile
und es dann mit Cassandra, Kafka erstellen können , Scala, Java und SBT sind alle eingebrannt, damit sie nur die Quelle kompilieren können. Ich habe jedoch viele Probleme damit.
Wie kombiniere ich diese Docker-Dateien? Wie mache ich einfach eine Umgebung mit diesen eingebrannten Dingen?
quelle
Antworten:
Mit der in Docker 1.17 eingeführten Funktion für mehrstufige Builds können Sie dies tun
Schau dir das an:
Erstellen Sie dann das Image normal:
Von: https://docs.docker.com/develop/develop-images/multistage-build/
quelle
nvidia-docker
und zusammengeführt wirdrustlang/rust:nightly
. Diese Bilder werden wiederum auf andere Bilder gelegt. Um dies mit mehrschichtigen Builds zu tun, muss ich alle Dateien von einem der Bilder kennen und angeben, die auf das andere Bild kopiert werden sollen - dies scheint unmöglich, zumal sich dieser Satz ändern kann, wenn sich das Upstream-Bild ändert. Lese ich das richtigFROM a/a:latest FROM b/b:latest COPY --from=0 / /
Wahrscheinlich schreckliche Übung, aber es funktioniert. Es war hauptsächlich aus eigener Neugier als etwas, das ich in der Produktion verwenden würde.FROM image1; CMD image1command; FROM image2; CMD image2command;
Es funktioniert überhaupt nicht. Immer nur der 2. BefehlSie können Docker-Dateien nicht kombinieren, da Konflikte auftreten können. Sie möchten eine neue Docker-Datei erstellen oder ein benutzerdefiniertes Image erstellen.
TL; DR; Wenn Ihr aktueller Entwicklungscontainer alle Tools enthält, die Sie benötigen und funktionieren, speichern Sie ihn als Image und darauf in einem Repo und erstellen Sie eine Docker-Datei, um dieses Image von diesem Repo abzurufen.
Details: Das Erstellen eines benutzerdefinierten Images ist weitaus einfacher als das Erstellen einer Docker-Datei mit einem öffentlichen Image, da Sie alle Hacks und Mods im Image speichern können. Starten Sie dazu einen leeren Container mit einem einfachen Linux-Image (oder Broadinstitute / Scala-Baseimage), installieren Sie alle benötigten Tools und konfigurieren Sie sie, bis alles ordnungsgemäß funktioniert, und speichern Sie sie (den Container) als Image. Erstellen Sie einen neuen Container aus diesem Image und testen Sie, ob Sie Ihren Code über Docker-Compose darauf aufbauen können (oder wie auch immer Sie ihn erstellen möchten). Wenn es funktioniert, haben Sie ein funktionierendes Basis-Image, das Sie in ein Repo hochladen können, damit andere es abrufen können.
Um eine Docker-Datei mit einem öffentlichen Image zu erstellen, müssen Sie alle Hacks, Mods und Setups in die Docker-Datei selbst einfügen. Das heißt, Sie müssen jede Befehlszeile, die Sie verwendet haben, in eine Textdatei einfügen und alle Hacks, Mods und Einstellungen in Befehlszeilen reduzieren. Am Ende erstellt Ihre Docker-Datei automatisch ein Bild und Sie müssen dieses Bild nicht in einem Repo speichern. Sie müssen lediglich anderen die Docker-Datei geben und sie können das Bild in ihrem eigenen Docker hochfahren.
Beachten Sie, dass Sie eine funktionierende Docker-Datei einfach anpassen können, sobald Sie eine Docker-Datei verwenden. Bei einem benutzerdefinierten Image können Probleme auftreten, bei denen Sie das Image aufgrund von Konflikten neu erstellen müssen. Beispielsweise arbeiten alle Ihre Tools mit openjdk, bis Sie eines installieren, das nicht funktioniert. Das Update beinhaltet möglicherweise die Deinstallation von openjdk und die Verwendung von Oracle One, aber alle Konfigurationen, die Sie für alle von Ihnen installierten Tools vorgenommen haben, sind fehlerhaft.
quelle
Die folgende Antwort gilt für Docker 1.7 und höher:
Ich würde es vorziehen zu verwenden
--from=NAME
undfrom image as NAME
warum? Sie können--from=0
und höher verwenden, aber dies kann etwas schwierig zu verwalten sein, wenn Sie viele Docker-Phasen in Docker-Datei haben.Beispielbeispiel:
Hinweis: Wenn Sie die Docker-Datei ordnungsgemäß verwalten, kann ein Docker-Image schneller erstellt werden. Intern verwendet Docker Docker-Layer-Caching, um diesen Prozess zu unterstützen, falls das Image neu erstellt werden muss.
quelle
Ja, Sie können eine ganze Menge Software in ein einzelnes Docker-Image rollen ( GitLab tut dies mit einem Image, das Postgres und alles andere enthält), aber Generalhenry ist richtig - das ist nicht die typische Art, Docker zu verwenden.
Wie Sie sagen, sind Cassandra und Kafka Abhängigkeiten für Ihre Scala-App. Sie sind nicht Teil der App, daher gehören nicht alle zum selben Bild.
Wenn Sie viele Container mit Docker Compose orchestrieren müssen, wird eine zusätzliche Administratorebene hinzugefügt, die Ihnen jedoch viel mehr Flexibilität bietet:
quelle
Sie konnten Docker-Bilder nicht in einem Container kombinieren. Sehen Sie die Detail Diskussionen in Moby Frage, Wie kann ich mehrere Bilder zu einem über Dockerfile kombinieren .
Für Ihren Fall ist es besser, nicht die gesamten Bilder von Cassandra und Kafka einzuschließen. Die Anwendung würde nur den Cassandra Scala-Treiber und den Kafka Scala-Treiber benötigen. Der Container sollte nur die Treiber enthalten.
quelle
Docker führt keine Zusammenführungen der Bilder durch, aber nichts hindert Sie daran, die Docker-Dateien, falls verfügbar, zu kombinieren und in sie zu einem fetten Bild zu rollen, das Sie erstellen müssten. Es gibt jedoch Zeiten, in denen dies sinnvoll ist, da für die Ausführung mehrerer Prozesse in einem Container die meisten Docker-Dogmen darauf hinweisen, dass dies insbesondere bei der Microservice-Architektur weniger wünschenswert ist (jedoch müssen Regeln gebrochen werden, oder?).
quelle
Ich brauchte Docker: Neueste und Python: Neueste Bilder für Gitlab CI. Folgendes habe ich mir ausgedacht:
Nachdem ich es erstellt und in mein Docker Hub-Repo verschoben habe:
Vergessen Sie nicht,
docker login
bevor Sie drückenIch hoffe es hilft
quelle