web-dev-qa-db-fra.com

Plusieurs FROM - ce que cela signifie

Je souhaite créer une image de menu fixe pour le projet Linkurious sur github, qui requiert à la fois la base de données Neo4j et Node.js.

ma première approche a été de déclarer une image de base pour mon image, contenant Neo4j. Les documents de référence ne définissent pas "l'image de base" de manière utile:

Image de base: une image sans parent est une image de base.

à partir duquel j'ai lu que je ne peux avoir une image de base que si cette image n'a pas d'image de base elle-même.

mais qu'est-ce qu'une image de base? Cela signifie-t-il que si je déclare neo4j/neo4j dans une directive FROM, lorsque mon image est exécutée, la base de données neo s'exécutera automatiquement et sera disponible dans le conteneur sur le port 7474?

lecture de la référence Docker (voir: https://docs.docker.com/reference/builder/#from ) Je vois:

FROM peut apparaître plusieurs fois dans un même fichier Dockerfile afin de créer plusieurs images. Notez simplement le dernier identifiant d'image généré par la validation avant chaque nouvelle commande FROM.

est-ce que je veux créer plusieurs images? il semblerait que ce que je veux, c'est avoir une seule image contenant le contenu d'autres images, par exemple. neo4j et node.js

J'ai trouvé aucune directive pour déclarer des dépendances dans le manuel de référence. n'y a-t-il pas de dépendances comme dans RPM où, pour pouvoir exécuter mon image, le contexte appelant doit d'abord installer les images dont il a besoin?

Je suis confus...

71
ekkis

qu'est-ce qu'une image de base?

Un ensemble de fichiers, plus EXPOSE 'd ports, ENTRYPOINT et CMD .
Vous pouvez ajouter des fichiers et construire une nouvelle image à partir de cette image de base, avec une nouvelle Dockerfile commençant par une directive FROM: l’image mentionnée après FROM est "l’image de base" de votre nouvelle image.

cela signifie-t-il que si je déclare neo4j/neo4j dans une directive FROM, lorsque mon image est exécutée, la base de données neo s'exécutera automatiquement et sera disponible dans le conteneur sur le port 7474?

Seulement si vous n'écrasez pas CMD et ENTRYPOINT.
Mais l’image en elle-même suffit: vous utiliseriez un FROM neo4j/neo4j si vous deviez ajouter des fichiers associés à neo4j pour votre utilisation particulière de neo4j.

FROM peut apparaître plusieurs fois dans un même fichier Docker

Ne pas: il est de toute façon proposé de supprimer cette "fonctionnalité" ( numéro 13026 )

Issue 14412 mentionne:

Utiliser plusieurs FROM n'est pas vraiment une fonctionnalité, mais un bogue (enfin, la limite est étroite et il y a peu de cas d'utilisation de plusieurs FROM dans un fichier Docker).


Mise à jour de mai 2017 (18 mois plus tard), avec docker (moby) 17.05-ce .

Plusieurs FROM peuvent être utilisés dans un seul fichier Docker.
Voir " Modèle de générateur vs. Constructions à plusieurs étages dans Docker " (by Alex Ellis) et PR 31257 par Tõnis Tiigi.

Avant:

Le modèle de construction implique l’utilisation de deux images Docker - une pour effectuer une construction et une autre pour envoyer les résultats de la première génération sans pénalité pour la chaîne de construction et l’outillage de la première image.

Après:

La syntaxe générale implique l'ajout de FROM fois supplémentaires dans votre fichier Docker - la dernière instruction FROM étant celle qui est la dernière image de base. Pour copier des artefacts et des sorties d'images intermédiaires, utilisez COPY --from=<base_image_number>.

Première partie du fichier 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 .

Deuxième partie du même (!) Fichier Docker:

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

Le résultat serait deux images, une pour la construction, une avec l'application résultante (beaucoup, beaucoup plus petit)

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

multi               latest              bcbbf69a9b59        6 minutes ago       10.3MB  
golang              1.7.3               ef15416724f6        4 months ago        672MB  
83
VonC