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. In den Referenzdokumenten wird "Basisimage" in keiner hilfreichen Weise definiert:
Basis-Image: Ein Image ohne übergeordnetes Image ist ein Basis-Image
von dem ich gelesen habe, dass ich möglicherweise nur ein Basis-Image habe, wenn dieses Image selbst kein Basis-Image hat.
aber was ist ein Basisimage? 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:
In einer einzelnen Docker-Datei kann FROM mehrmals vorkommen, um mehrere Bilder zu erstellen. Notieren Sie sich einfach vor jedem neuen FROM-Befehl die letzte von der Festschreibung ausgegebene Bild-ID.
möchte ich mehrere Bilder erstellen? es scheint so, als ob ich ein einzelnes Bild haben möchte, das den Inhalt anderer Bilder enthält, z. neo4j und node.js
Ich habe keine Direktive gefunden, um Abhängigkeiten im Referenzhandbuch zu deklarieren. Gibt es keine Abhängigkeiten wie in RPM, bei denen der aufrufende Kontext zuerst die benötigten Images installieren muss, um mein Image auszuführen?
Ich bin verwirrt...
was ist ein Basisimage?
Eine Reihe von Dateien plus EXPOSE
'd Ports, ENTRYPOINT
und CMD
.
Sie können Dateien hinzufügen und basierend auf diesem Basis-Image ein neues Image erstellen, wobei ein neues Dockerfile
mit einer FROM
-Direktive beginnt: das nach FROM
angegebene Image. ist "das Basis-Image" für Ihr neues Image.
bedeutet das, dass, wenn ich
neo4j/neo4j
in einerFROM
-Direktive deklariere, die neo-Datenbank automatisch ausgeführt wird und im Container auf Port 7474 verfügbar ist, wenn mein Image ausgeführt wird?
Nur wenn Sie CMD
und ENTRYPOINT
nicht überschreiben.
Aber das Bild an sich ist genug: Sie würden einen FROM neo4j/neo4j
Verwenden, wenn Sie für Ihre spezielle Verwendung von neo4j
Dateien hinzufügen müssten, die sich auf neo4j
Beziehen.
FROM
kann in einer einzelnen Docker-Datei mehrfach vorkommen
Nicht: es gibt einen Vorschlag, diese "Funktion" trotzdem zu entfernen ( Problem 13026 )
Ausgabe 14412 erwähnt:
Die Verwendung mehrerer
FROM
ist nicht wirklich ein Feature, sondern ein Fehler (na ja, das Limit ist eng und es gibt nur wenige Anwendungsfälle für mehrereFROM
in einer Docker-Datei).
Update Mai 2017 (18 Monate später) mit docker (moby) 17.05-ce .
In einem Dockerfile können mehrere FROM can verwendet werden.
Siehe " Builder-Muster im Vergleich zu mehrstufigen Builds in Docker " (von Alex Ellis) und PR 31257 von Tõnis Tiigi.
Vor:
Das Builder-Muster umfasst die Verwendung von zwei Docker-Images: eines zum Ausführen eines Builds und eines zum Versenden der Ergebnisse des ersten Builds, ohne dass die Build-Kette und das Tooling im ersten Image beeinträchtigt werden.
Nach:
Die allgemeine Syntax beinhaltet das Hinzufügen von
FROM
zusätzlichen Zeiten in Ihrer Docker-Datei - die letzteFROM
Anweisung ist das endgültige Basis-Image. Verwenden SieCOPY --from=<base_image_number>
, Um Artefakte und Ausgaben von Zwischenbildern zu kopieren.
Erster Teil der Dockerfile:
FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
Zweiter Teil der same (!) Dockerfile:
FROM Alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]
Das Ergebnis wären zwei Bilder, eines zum Bauen, eines nur mit der resultierenden App (viel, viel kleiner)
REPOSITORY TAG IMAGE ID CREATED SIZE
multi latest bcbbf69a9b59 6 minutes ago 10.3MB
golang 1.7.3 ef15416724f6 4 months ago 672MB