Ich möchte ein Docker-Image für das Linkurious- Projekt auf github erstellen, für dessen Ausführung sowohl die Neo4j-Datenbank als auch Node.js erforderlich sind.
Mein erster Ansatz war, ein Basis-Image für mein Image zu deklarieren, das Neo4j enthält. Die Referenzdokumente definieren "Basisbild" nicht auf hilfreiche Weise:
Basisbild: Ein Bild ohne übergeordnetes Element ist ein Basisbild
von dem ich gelesen habe, dass ich möglicherweise nur ein Basisbild habe, wenn dieses Bild selbst kein Basisbild hat.
aber was ist ein Grundbild? Bedeutet dies, dass, wenn ich neo4j / neo4j in einer FROM-Direktive deklariere, die neo-Datenbank automatisch ausgeführt wird und im Container auf Port 7474 verfügbar ist, wenn mein Image ausgeführt wird?
Lesen der Docker-Referenz (siehe: https://docs.docker.com/reference/builder/#from ) Ich sehe:
FROM kann in einer einzelnen Docker-Datei mehrmals angezeigt werden, um mehrere Bilder zu erstellen. Notieren Sie sich einfach die letzte vom Commit ausgegebene Bild-ID vor jedem neuen FROM-Befehl.
möchte ich mehrere Bilder erstellen? Ich möchte anscheinend ein einzelnes Bild haben, das den Inhalt anderer Bilder enthält, z. B. neo4j und node.js.
Ich habe im Referenzhandbuch keine Anweisung gefunden, Abhängigkeiten zu deklarieren. Gibt es keine Abhängigkeiten wie in RPM, bei denen der aufrufende Kontext zum Ausführen meines Images zuerst die benötigten Images installieren muss?
Ich bin verwirrt...
quelle
FROM
in einemDockerfile
. Siehe meine bearbeitete Antwort unten.Antworten:
Eine Reihe von Dateien sowie
EXPOSE
'd PortsENTRYPOINT
undCMD
.Sie können Dateien hinzufügen und ein neues Image basierend auf diesem Basis-Image erstellen, wobei ein neues
Dockerfile
mit einerFROM
Direktive beginnt : Das nachfolgend erwähnte ImageFROM
ist "das Basis-Image" für Ihr neues Image.Nur wenn Sie nicht überschreiben
CMD
undENTRYPOINT
.Aber das Bild an sich ist genug: Sie würden ein verwenden,
FROM neo4j/neo4j
wenn Sie Dateien hinzufügen müssten , die sichneo4j
auf Ihre spezielle Verwendung von beziehenneo4j
.Tu es nicht: Es gibt einen Vorschlag, diese "Funktion" trotzdem zu entfernen ( Problem 13026 ).Ausgabe 14412 erwähnt:
Update Mai 2017 (18 Monate später) mit Docker (Moby) 17.05-ce .
In einer Docker-Datei können mehrere FROM verwendet werden.
Siehe " Builder-Muster vs. mehrstufige Builds in Docker " (von Alex Ellis ) und PR 31257 von Tõnis Tiigi .
Vor:
Nach dem:
Erster Teil der Docker-Datei:
Zweiter Teil derselben (!) Docker-Datei:
Das Ergebnis wären zwei Bilder, eines zum Erstellen, eines nur mit der resultierenden App (viel, viel kleiner).
quelle
Die erste Antwort ist zu komplex, historisch und für meinen Geschmack nicht informativ.
Es ist eigentlich ziemlich einfach. Docker bietet eine Funktionalität, die als mehrstufige Builds bezeichnet wird. Die Grundidee hier ist:
Beginnen wir mit dem ersten. Sehr oft mit so etwas wie Debian werden Sie sehen.
All dies können wir mit den obigen Ausführungen erklären. Der obige Befehl ist verkettet, sodass er eine einzelne Änderung darstellt, ohne dass Zwischenbilder erforderlich sind. Wenn es so geschrieben wurde,
Dies würde zu 3 weiteren temporären Zwischenbildern führen. Wenn es auf ein Image reduziert wird, gibt es noch ein Problem:
apt-get clean
Bereinigt keine bei der Installation verwendeten Artefakte. Wenn ein Debian-Betreuer in seine Installation ein Skript einbezieht, das das System ändert, ist diese Änderung auch in der endgültigen Lösung vorhanden (siehe etwapepperflashplugin-nonfree
ein Beispiel dafür).Durch die Verwendung eines mehrstufigen Builds erhalten Sie alle Vorteile einer einzelnen geänderten Aktion. Sie müssen jedoch manuell Dateien auf die Whitelist setzen und kopieren, die im temporären Image mit der
COPY --from
hier dokumentierten Syntax eingeführt wurden. Darüber hinaus ist es eine großartige Lösung, bei der es keine Alternative (wie eineapt-get clean
) gibt und Sie sonst viele nicht benötigte Dateien in Ihrem endgültigen Bild hätten.Siehe auch
quelle
FROM
ist hauptsächlich eine Namespace-Deklaration. Das Qualifikationsmerkmal dort ist eher eine Erweiterung als eine Vererbung. Sie können mehrere Namespaces deklarieren. Und jeder dieser Namespaces kann einen weiteren Namespace erweitern. @ekkis Wenn die andere Antwort für Sie funktioniert, dann bleiben Sie auf jeden Fall dabei.