Je souhaite créer une image docker pour le projet Linkurious sur github, qui nécessite à la fois la base de données Neo4j et Node.js pour fonctionner.
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 «image de base» de manière utile:
Image de base: une image sans parent est une image de base
d'où 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, que 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?
en lisant 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 Dockerfile afin de créer plusieurs images. Notez simplement le dernier ID d'image généré par le commit 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
Je n'ai trouvé aucune directive pour déclarer les dépendances dans le manuel de référence. n'y a-t-il pas de dépendances comme dans RPM où, pour exécuter mon image, le contexte appelant doit d'abord installer les images dont il a besoin?
Je suis confus...
la source
FROM
dans un fichierDockerfile
. Voir ma réponse modifiée ci-dessous.Réponses:
Un ensemble de fichiers, plus
EXPOSE
'd portsENTRYPOINT
etCMD
.Vous pouvez ajouter des fichiers et construire une nouvelle image basée sur cette image de base, avec une nouvelle
Dockerfile
commençant par uneFROM
directive: l'image mentionnée aprèsFROM
est "l'image de base" pour votre nouvelle image.Seulement si vous n'écrasez pas
CMD
etENTRYPOINT
.Mais l'image en elle-même suffit: vous utiliseriez a
FROM neo4j/neo4j
si vous deviez ajouter des fichiers liés àneo4j
pour votre utilisation particulière deneo4j
.Ne pas: il y a une proposition pour supprimer cette "fonctionnalité" de toute façon ( problème 13026 )Le numéro 14412 mentionne:
Mise à jour de mai 2017 (18 mois plus tard), avec docker (moby) 17.05-ce .
Plusieurs FROM peuvent être utilisés dans un seul Dockerfile.
Voir « Modèle de générateur contre builds multi-étapes dans Docker » (par Alex Ellis ) et PR 31257 par Tõnis Tiigi .
Avant:
Après:
Première partie du Dockerfile:
Deuxième partie du même (!) Dockerfile:
Le résultat serait deux images, une pour la construction, une avec juste l'application résultante (beaucoup, beaucoup plus petite)
la source
La première réponse est trop complexe, historique et peu informative à mon goût.
C'est en fait assez simple. Docker fournit une fonctionnalité appelée builds en plusieurs étapes, l'idée de base ici est de,
Commençons par le premier. Très souvent, avec quelque chose comme Debian, vous verrez.
Nous pouvons expliquer tout cela en termes de ce qui précède. La commande ci-dessus est enchaînée afin de représenter un seul changement sans images intermédiaires requises. Si c'était écrit comme ça,
Il en résulterait 3 images intermédiaires temporaires supplémentaires. Après l'avoir réduit à une image, il reste un problème:
apt-get clean
ne nettoie pas les artefacts utilisés dans l'installation. Si un responsable Debian inclut dans son installation un script qui modifie le système, cette modification sera également présente dans la solution finale (voir quelque chose commepepperflashplugin-nonfree
pour un exemple de cela).En utilisant une construction en plusieurs étapes, vous bénéficiez de tous les avantages d'une seule action modifiée, mais cela vous obligera à mettre manuellement sur liste blanche et à copier les fichiers qui ont été introduits dans l'image temporaire en utilisant la
COPY --from
syntaxe documentée ici. De plus, c'est une excellente solution là où il n'y a pas d'alternative (comme uneapt-get clean
), et vous auriez autrement beaucoup de fichiers inutiles dans votre image finale.Voir également
la source
FROM
est principalement une déclaration d'espace de noms. Le qualificatif là-bas ressemble plus à une extension qu'à un héritage. Vous pouvez déclarer plusieurs espaces de noms. Et chacun de ces espaces de noms peut étendre un autre espace de noms. @ekkis Si l'autre réponse fonctionne pour vous, alors respectez-la.