Quiero crear una imagen de la ventana acoplable para el proyecto Linkurious en github, que requiere tanto la base de datos Neo4j como Node.js para ejecutarse.
mi primer enfoque fue declarar una imagen base para mi imagen, que contiene Neo4j. Los documentos de referencia no definen "imagen base" de ninguna manera útil:
Imagen base: una imagen que no tiene padre es una imagen base
del cual leí que solo puedo tener una imagen base si esa imagen no tiene una imagen base en sí.
pero ¿qué es una imagen base? ¿Significa que si declaro neo4j / neo4j en una directiva FROM, cuando se ejecute mi imagen, la base de datos neo se ejecutará automáticamente y estará disponible dentro del contenedor en el puerto 7474?
leyendo la referencia de Docker (ver: https://docs.docker.com/reference/builder/#from ) veo:
FROM puede aparecer varias veces dentro de un solo Dockerfile para crear varias imágenes. Simplemente tome nota de la última ID de imagen generada por la confirmación antes de cada nuevo comando FROM.
¿Quiero crear varias imágenes? parece que lo que quiero es tener una sola imagen que contenga el contenido de otras imágenes, por ejemplo, neo4j y node.js
No encontré ninguna directiva para declarar dependencias en el manual de referencia. ¿No hay dependencias como en RPM donde para ejecutar mi imagen, el contexto de llamada debe instalar primero las imágenes que necesita?
Estoy confundido...
fuente
FROM
en unDockerfile
. Vea mi respuesta editada a continuación.Respuestas:
Un conjunto de archivos, más
EXPOSE
'd portsENTRYPOINT
yCMD
.Puede agregar archivos y crear una nueva imagen basada en esa imagen base, con un nuevo
Dockerfile
comienzo con unaFROM
directiva: la imagen que se menciona despuésFROM
es "la imagen base" para su nueva imagen.Solo si no sobrescribe
CMD
yENTRYPOINT
.Pero la imagen en sí misma es suficiente: usaría un
FROM neo4j/neo4j
si tuviera que agregar archivos relacionadosneo4j
para su uso particular deneo4j
.No: hay una propuesta para eliminar esa "función" de todos modos ( problema 13026 )El número 14412 menciona:
Actualización de mayo de 2017 (18 meses después), con Docker (moby) 17.05-ce .
Se pueden usar varios FROM en un solo Dockerfile.
Consulte " Patrón de constructor frente a compilaciones de varias etapas en Docker " (por Alex Ellis ) y PR 31257 por Tõnis Tiigi .
Antes de:
Después:
Primera parte del Dockerfile:
Segunda parte del mismo (!) Dockerfile:
El resultado serían dos imágenes, una para la construcción, otra con solo la aplicación resultante (mucho, mucho más pequeña)
fuente
La primera respuesta es demasiado compleja, histórica y poco informativa para mi gusto.
En realidad, es bastante simple. Docker proporciona una funcionalidad llamada compilaciones de múltiples etapas, la idea básica aquí es,
Empecemos por el primero. Muy a menudo con algo como Debian verá.
Podemos explicar todo esto en términos de lo anterior. El comando anterior está encadenado, por lo que representa un único cambio sin imágenes intermedias requeridas. Si estuviera escrito así,
El resultado sería 3 imágenes intermedias temporales más. Habiéndolo reducido a una imagen, queda un problema restante:
apt-get clean
no limpia los artefactos utilizados en la instalación. Si un mantenedor de Debian incluye en su instalación un script que modifica el sistema, esa modificación también estará presente en la solución final (vea algo así comopepperflashplugin-nonfree
un ejemplo de eso).Al usar una compilación de múltiples etapas, obtiene todos los beneficios de una sola acción modificada, pero requerirá que ingrese manualmente en la lista blanca y copie los archivos que se introdujeron en la imagen temporal utilizando la
COPY --from
sintaxis documentada aquí. Además, es una gran solución donde no hay alternativa (como unaapt-get clean
), y de lo contrario tendría muchos archivos innecesarios en su imagen final.Ver también
fuente
FROM
es principalmente una declaración de espacio de nombres. El calificativo se parece más a una extensión que a una herencia. Puede declarar varios espacios de nombres. Y cada uno de esos espacios de nombres puede ampliar otro espacio de nombres. @ekkis Si la otra respuesta funciona para usted, entonces quédese con ella.