Tengo algunos Dockerfiles en este momento.
Uno es para Cassandra 3.5, y es FROM cassandra:3.5
También tengo un Dockerfile para Kafka, pero es un poco más complejo. Es FROM java:openjdk-8-fre
y ejecuta un comando largo para instalar Kafka y Zookeeper.
Finalmente, tengo una aplicación escrita en Scala que usa SBT.
Para ese Dockerfile, es FROM broadinstitute/scala-baseimage
, que me da Java 8, Scala 2.11.7 y STB 0.13.9, que son lo que necesito.
Quizás, no entiendo cómo funciona Docker, pero mi programa Scala tiene a Cassandra y Kafka como dependencias y, para propósitos de desarrollo, quiero que otros puedan simplemente clonar mi repositorio con el Dockerfile
y luego poder construirlo con Cassandra, Kafka , Scala, Java y SBT todos integrados para que puedan simplemente compilar la fuente. Sin embargo, tengo muchos problemas con esto.
¿Cómo combino estos Dockerfiles? ¿Cómo puedo simplemente crear un ambiente con esas cosas incorporadas?
fuente
Respuestas:
Puede, con la función de compilaciones de varias etapas introducida en Docker 1.17
Mira esto:
Luego construye la imagen normalmente:
De: https://docs.docker.com/develop/develop-images/multistage-build/
fuente
nvidia-docker
yrustlang/rust:nightly
. Estas imágenes, a su vez, se superponen a otras imágenes. Para hacer esto usando compilaciones multicapa, tengo que conocer y especificar todos los archivos de una de las imágenes que quiero copiar a la otra imagen; parece imposible, particularmente porque ese conjunto puede cambiar cada vez que cambia la imagen ascendente. ¿Estoy leyendo esto bien?FROM a/a:latest FROM b/b:latest COPY --from=0 / /
Probablemente una práctica terrible, pero funciona. Fue principalmente por mi propia curiosidad que por algo que usaría en la producción.FROM image1; CMD image1command; FROM image2; CMD image2command;
No funciona en absoluto. Siempre solo el segundo comandoNo puede combinar archivos docker porque pueden producirse conflictos. Lo que quiere hacer es crear un nuevo archivo docker o crear una imagen personalizada.
TL; DR; Si su contenedor de desarrollo actual contiene todas las herramientas que necesita y funciona, guárdelo como una imagen y luego en un repositorio y cree un archivo docker para extraer esa imagen de ese repositorio.
Detalles: crear una imagen personalizada es mucho más fácil que crear un archivo docker con una imagen pública, ya que puede almacenar los hacks y modificaciones en la imagen. Para hacerlo, inicie un contenedor en blanco con una imagen básica de Linux (o broadinstitute / scala-baseimage), instale las herramientas que necesite y configúrelas hasta que todo funcione correctamente, luego guárdelo (el contenedor) como una imagen. Cree un nuevo contenedor a partir de esta imagen y pruebe para ver si puede compilar su código sobre él a través de docker-compose (o como quiera hacerlo / compilarlo). Si funciona, entonces tiene una imagen base de trabajo que puede cargar en un repositorio para que otros puedan extraerla.
Para crear un dockerfile con una imagen pública, deberá colocar todos los hacks, modificaciones y configuraciones en el dockerfile. Es decir, deberá colocar cada línea de comando que utilizó en un archivo de texto y reducir los hacks, modificaciones y configuración en líneas de comando. Al final, su dockerfile creará una imagen automáticamente y no necesita almacenar esta imagen en un repositorio y todo lo que necesita hacer es darles a otros el dockerfile y ellos pueden girar la imagen en su propia ventana acoplable.
Tenga en cuenta que una vez que tenga un archivo docker en funcionamiento, puede modificarlo fácilmente, ya que creará una nueva imagen cada vez que use el archivo docker. Con una imagen personalizada, es posible que tenga problemas en los que necesite reconstruir la imagen debido a conflictos. Por ejemplo, todas sus herramientas funcionan con openjdk hasta que instala una que no funciona. La solución puede implicar desinstalar openjdk y usar el de Oracle, pero toda la configuración que hizo para todas las herramientas que instaló se rompió.
fuente
La siguiente respuesta se aplica a Docker 1.7 y superior:
Preferiría usar
--from=NAME
yfrom image as NAME
¿Por qué? Puede usar--from=0
y superior, pero esto puede resultar un poco difícil de administrar cuando tiene muchas etapas de docker en dockerfile.ejemplo de muestra:
Nota: Administrar el archivo docker correctamente ayudará a crear una imagen de la ventana acoplable más rápido. Internamente, la ventana acoplable usa el almacenamiento en caché de la capa de la ventana acoplable para ayudar con este proceso, en caso de que la imagen deba reconstruirse.
fuente
Sí, puede convertir una gran cantidad de software en una sola imagen de Docker ( GitLab hace esto, con una imagen que incluye Postgres y todo lo demás), pero generalhenry tiene razón: esa no es la forma típica de usar Docker.
Como dices, Cassandra y Kafka son dependencias de tu aplicación Scala, no son parte de la aplicación, por lo que no todas pertenecen a la misma imagen.
Tener que orquestar muchos contenedores con Docker Compose agrega una capa de administración adicional, pero le brinda mucha más flexibilidad:
fuente
No puede combinar imágenes de Docker en 1 contenedor. Vea las discusiones detalladas en la edición de Moby, ¿Cómo combino varias imágenes en una a través de Dockerfile ?
Para su caso, es mejor no incluir todas las imágenes de Cassandra y Kafka. La aplicación solo necesitaría el controlador Cassandra Scala y el controlador Kafka Scala. El contenedor debe incluir solo los controladores.
fuente
Docker no fusiona las imágenes, pero no hay nada que le impida combinar los archivos de docker, si están disponibles, y convertirlos en una imagen amplia que necesitaría compilar. Sin embargo, hay momentos en los que esto tiene sentido, ya que para ejecutar múltiples procesos en un contenedor, la mayoría de los dogmas de Docker señalarán que esto es menos deseable, especialmente con la arquitectura de microservicios (sin embargo, las reglas deben romperse, ¿verdad?)
fuente
Necesitaba docker: latest y python: últimas imágenes para Gitlab CI. Esto es lo que se me ocurrió:
Después de compilarlo y enviarlo a mi repositorio de Docker Hub:
No olvides
docker login
antes de empujarEspero eso ayude
fuente