En esta ocasión vamos a plantear una pequeña pildorilla técnica a raíz de una situación que me he encontrado. Supongamos que para un contendedor de docker queremos dejar lanzadas dos microservicios, aplicaciones… en resumidas cuentas queremos lanzar dos jar en un mismo contenedor.
Veamos como hemos resuelto este problema con los dos siguientes ficheros:
Por un lado tenemos el Dockerfile con dos imágenes. Una con maven para compilar, testear y empaquetar el jar
. Y otra que lo que hará es coger los dos ficheros jar
generados movelos a una carpeta y cargar un script de sh
. Los ejemplos que estuve viendo iban con bash, pero al tratarse de una imagen alpine
lo hemos realizado con sh
FROM maven:3.6.3-openjdk-8-slim AS build
COPY demo-command/src /usr/src/demo-cqrs/demo-command/src
COPY demo-command/pom.xml /usr/src/demo-cqrs/demo-command
COPY demo-query/src /usr/src/demo-cqrs/demo-query/src
COPY demo-query/pom.xml /usr/src/demo-cqrs/demo-query
COPY pom.xml /usr/src/demo-cqrs
RUN mvn -f /usr/src/demo-cqrs/pom.xml clean package
FROM openjdk:8-alpine AS demo-cqrs
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
COPY --from=build /usr/src/demo-cqrs/demo-command/target/demo-command-0.0.1-SNAPSHOT.jar /usr/app/demo-command-0.0.1-SNAPSHOT.jar
COPY --from=build /usr/src/demo-cqrs/demo-query/target/demo-query-0.0.1-SNAPSHOT.jar /usr/app/demo-query-0.0.1-SNAPSHOT.jar
ADD start.sh .
EXPOSE 8081 8082
CMD ["sh", "start.sh"]
Hasta aqui poco que decir, la duda es que demonios hace ese start.sh
. Paso a mostrarlo a continuación:
#start.sh
java -jar /usr/app/demo-command-0.0.1-SNAPSHOT.jar & java -jar /usr/app/demo-query-0.0.1-SNAPSHOT.jar
Como vemos este script
lo unico que hará es lanzar ambos fichero jar
con java. Y bueno con todo esto tenemos resuelto un contenedor con las aplicaciones java que queramos en ejecución.