2015-10-24 15 views
21

Voglio creare un'immagine finestra mobile per il progetto Linkurious su github, che richiede sia il database Neo4j che Node.js per l'esecuzione.Multiple FROM - cosa significa

il mio primo approccio era quello di dichiarare un'immagine di base per la mia immagine, contenente Neo4j. La documentazione di riferimento non definiscono "immagine di base" in qualsiasi modo utile:

immagine Base: Un'immagine che non ha alcun genitore è un'immagine di base

da cui ho letto che io possa avere solo un'immagine di base se quell'immagine non ha alcuna immagine di base.

ma che cos'è un'immagine di base? vuol dire che se dichiaro neo4j/neo4j in una direttiva FROM, che quando viene eseguita la mia immagine il database neo verrà eseguito automaticamente e sarà disponibile all'interno del contenitore sulla porta 7474?

leggere il riferimento Docker (vedi: https://docs.docker.com/reference/builder/#from) Vedo:

DA può apparire più volte all'interno di un singolo Dockerfile al fine di creare immagini multiple. Basta prendere nota dell'ultimo ID immagine emesso dal commit prima di ogni nuovo comando FROM.

voglio creare più immagini? sembrerebbe quello che voglio è avere una singola immagine che contenga il contenuto di altre immagini, ad es. neo4j e node.js

Non ho trovato alcuna direttiva per dichiarare dipendenze nel manuale di riferimento. non ci sono dipendenze come in RPM dove per eseguire la mia immagine il contesto di chiamata deve prima installare le immagini di cui ha bisogno?

Sono confuso ...

+0

Nota: maggio 2017 , ora hai più 'FROM' in un' Dockerfile'. Vedi la mia risposta modificata qui sotto. – VonC

risposta

27

ciò che è un'immagine di base?

Un insieme di file più EXPOSE 'd porti, ENTRYPOINT e CMD.
È possibile aggiungere file e creare una nuova immagine basata su quell'immagine di base, con un nuovo Dockerfile che inizia con una direttiva FROM: l'immagine menzionata dopo FROM è "l'immagine di base" per la nuova immagine.

cosa significa che se dichiaro neo4j/neo4j in una direttiva FROM, che quando la mia immagine viene eseguito il database neo verrà eseguito e saranno disponibili all'interno del contenitore sulla porta 7474 automaticamente?

Solo se non si sovrascrivono CMD e ENTRYPOINT.
Ma l'immagine in sé è sufficiente: si utilizzerà un FROM neo4j/neo4j se si dovessero aggiungere file relativi a neo4j per l'utilizzo specifico di neo4j.

FROM può apparire più volte all'interno di un unico Dockerfile

non fare: c'è una proposta per rimuovere quella "caratteristica" in ogni caso (issue 13026)

Issue 14412 menzioni:

L'utilizzo di più FROM non è realmente una funzione ma un bug (vabbè, il limite è limitato e ci sono pochi casi d'uso per più FROM in un Dockerfile).


Aggiornamento Maggio 2017 (18 mesi più tardi), con docker (moby) 17.05-ce.

Multiple DA può essere utilizzato in un singolo Dockerfile.
Vedere "Builder pattern vs. Multi-stage builds in Docker" (da Alex Ellis) e PR 31257 da Tõnis Tiigi.

Prima:

Il builder comporta usando due immagini Docker - uno a eseguire una generazione e l'altra per spedire i risultati del primo costruire senza la penalità del build-catena e utensili nella prima immagine .

Dopo:

La sintassi generale prevede l'aggiunta di FROM tempi supplementari all'interno del vostro Dockerfile - a seconda di quale è l'ultima FROM affermazione è l'immagine di base finale. Per copiare artefatti e output da immagini intermedie utilizzare COPY --from=<base_image_number>.

Esempio:

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 . 

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"] 

Il risultato sarebbe due immagini, una per edilizia, uno con solo l'applicazione risultante (molto, molto più piccolo)

REPOSITORY   TAG     IMAGE ID   CREATED    SIZE 

multi    latest    bcbbf69a9b59  6 minutes ago  10.3MB 
golang    1.7.3    ef15416724f6  4 months ago  672MB 
+0

peccato per la rimozione di più DA. mi sembra più utile, in particolare in assenza di meccanismi di dipendenza. con RPM, ad esempio, posso dichiarare che il mio pacchetto ha bisogno di un altro pacchetto per funzionare così al momento dell'installazione tutto viene impostato per me. la realtà è che la maggior parte delle cose richiederà più dipendenze, quindi, in assenza di più DI, come si suppone che funzioni? – ekkis

+1

@ekkis come ho menzionato nella mia precedente risposta (http://stackoverflow.com/a/33295292/6309), si esegue il sistema orchestrando più contenitori, ognuno dei quali fornisce un particolare servizio e comunicando tramite --link (https : //docs.docker.com/userguide/dockerlinks/#communication-across-links). – VonC