En mi aplicación maven tengo múltiples proyectos:
La Application 1 y la Application 2 son dos proyectos que usan el core (por ejemplo, esas aplicaciones están diseñadas para dos clientes diferentes)
Para dockerizarlos todos, la forma más sencilla sería crear un proyecto de varios módulos, pero la desventaja es que tengo todo dentro de un solo proyecto (núcleo + Aplicación 1 + Aplicación 2).
Me gustaría tener el núcleo separado de ellos.
El principal problema con esta configuración es que el proyecto core debe construirse antes que los otros dos, y la App 1 y la App 2 usan esto como una dependencia experta:
App 1
<dependency> <groupId>it.myorg</groupId> <artifactId>core-project</artifactId> <version>1.12.0-SNAPSHOT</version> </dependency> Si trato de dockerizar la App 1 , falla cuando la empaqueto, porque dentro del contenedor docker core-project 1.12.0-SNAPSHOT no existe.
Estaba pensando en configurar un "repositorio experto local", presionando el núcleo allí y la App 1 "tirará" del contenedor del repositorio y no de la carpeta .m2 , pero no me gusta esta solución.
Puedo proporcionar más información, lo siento si no doy ejemplos, pero mi papel es blanco en este momento :(
Estructura de carpetas
+- Core --- pom.xml --- src +- Application1 --- pom.xml --- srcLa solución que estoy tratando de hacer ahora es crear un Dockerfile para el proyecto principal (DESDE maven: más reciente), construir la imagen con una etiqueta y en Dockerfile de App1 usar esta imagen (es decir, crear una compilación de varias etapas pero en dos momentos separados) ).
lo mejor seria
FROM maven:latest as core-builder ## build the core FROM maven:latest ## Copy jar from builderDebido a que el proyecto está en una carpeta separada, no puedo construir el núcleo de esta manera. Necesito compilar del core ANTES (ejecutando docker build -t) y luego copiar de ellos.
ACTUALIZAR
Después de la respuesta correcta de @mihai, pregunto si es posible una estructura como esta:
-- myapp-docker - Dockerfile - docker-compose.yml -- core-app -- application_1 Tener Dockerfile al mismo nivel de core-app y application_1 está totalmente bien y funciona al 100%. El único "problema" es que debería poner todos los proyectos en el mismo repositorio.
Esta es la solución propuesta con construcciones de varias etapas.
Para replicar su configuración, creé esta estructura:
. ├── Dockerfile-app1 ├── application1 │ ├── pom.xml │ └── src │ └── main │ ├── resources │ └── webapp │ ├── WEB-INF │ │ └── web.xml │ └── index.jsp ├── core │ ├── pom.xml │ └── src │ ├── main │ │ └── java │ │ └── com │ │ └── test │ │ └── App.java │ └── test │ └── java │ └── com │ └── test │ └── AppTest.java En el archivo pom.xml de la Aplicación 1, agregué la dependencia al core :
<dependency> <groupId>com.test</groupId> <artifactId>core</artifactId> <version>1.0-SNAPSHOT</version> </dependency> Llamé al Dockerfile Dockerfile-app1 , de esta manera puedes tener más de 1 de ellos.
Este es el Dockerfile-app1:
FROM maven:3.6.0-jdk-8 as build WORKDIR /apps COPY ./core . RUN mvn clean install FROM maven:3.6.0-jdk-8 # If you comment this out then the build fails because it cannot find the dependency to 'core' COPY --from=build /root/.m2 /root/.m2 COPY ./application1 ./ RUN mvn clean installProbablemente debería agregar un punto de entrada al final para ejecutar su proyecto o, mejor aún, agregar otra tercera etapa que solo copie los artefactos generados y ejecute su proyecto (de esta manera, la imagen final no tendrá su origen).
La primera etapa solo construye el submódulo core .
La segunda etapa usó los resultados de la primera etapa, copia solo el código fuente de application1 y lo construye.
Puede replicar esto fácilmente para application2 creando un archivo similar Dockerfile-app2 .
Ya que está usando maven, intente dockerfile-maven para construir la imagen. No desea ninguna información de compilación dentro de su imagen (como cuáles son las dependencias), solo debe agregar el contenedor al final. Por lo general, lo uso junto con spring-boot-maven-plugin y repackage para obtener un contenedor completamente autónomo.