Archivo de portador de Java. ¿Cree y pruebe o simplemente ejecute el file jar?

Estoy pensando en esto en una interconnection de CI donde primero debería comstackr y probar mi aplicación y el resultado debería ser una image de acoplador.

Me pregunto si es más común build en el server de compilation utilizando el entorno de compilation y luego ejecutar testings. Tal vez usando un script de compilation para esto. Y, por último, simplemente agregue el file jar al contenedor Docker producido usando COPY y luego tenga Entrypoint java -jar .jar. Por lo tanto, mantenga el file Docker muy pequeño y realice testings y construcciones fuera del contenedor.

Un poco como esto:

FROM openjdk:8-jre-alpine CMD java ${JAVA_OPTS} -jar *.jar COPY build/libs/*.jar . 

O si debería agregar todo el código fuente al contenedor, comstackrlo y luego ejecutar testings dentro del contenedor y luego tener el Entrypoint (como antes) ejecutando el file jar que se produjo? Entonces, ¿save todo en el file Docker? Tal vez haciendo algo de limpieza también, eliminando el código fuente

Esto realmente no tiene que ser Java, supongo, la misma pregunta se aplica a todos los idiomas

Optimizando la construcción del contenedor

Históricamente, uno se vio obligado a ejecutar Docker dos veces para crear una image de acoplador que no contenía el código fuente (y el software utilizado para crear el binary). Por ejemplo, vea

  • Cómo build un contenedor docker para una aplicación java

Ahora, Docker admite una nueva capacidad de compilation de varias etapas:

Esto permite a Docker build un contenedor con una image que contenga las herramientas de compilation, pero genera una image solo con las dependencies de time de ejecución. El siguiente ejemplo demuestra este concepto, observe cómo se copy el jar del directory de destino de la primera fase de compilation

 FROM maven:3.3-jdk-8-onbuild FROM java:8 COPY --from=0 /usr/src/app/target/demo-1.0-SNAPSHOT.jar /opt/demo.jar CMD ["java","-jar","/opt/demo.jar"] 

La image resultante no contiene el maven, solo java y el jar construido.

Pruebas

Suponiendo que no estamos hablando de testings unitarias (que se pueden ejecutar localmente), una testing de integración requiere que el código se deployment primero. La respuesta en este caso depende en gran medida de cómo deployment su aplicación en contenedor de Java.

Por ejemplo, si está usando Kubernetes u Openshift, una opción es usar el complemento Fabric8 para implementar el código antes de ejecutar su fase de testing en Maven.

Usted construye y testing la aplicación en la llamada image del acoplador de construcción, con el JDK y todas las herramientas que necesita para ese fin. Cuando termines y estés contento, extraes el jar / war como un artefacto en tu tubería CI / CD y luego, cuando lo consideres listo para producción, construyes una image de docker de producción y colocas el artefacto dentro, donde solo tienes un JRE / Tomcat (lo que sea que necesite para la producción solamente): no tiene herramientas de desarrollo, no comstack herramientas, es lo más pequeño, elegante y simple posible.

Así que básicamente siempre tienes 2 imágenes por aplicación, una para buildla y otra para ejecutarla en producción. Mezclar ambos es una práctica muy mala y nos llevará a problemas tarde o temprano.

Construir en el host es aún peor, ya que no utiliza entornos limpios de esta manera, que es más o less una de las ganancias key con Docker, y no puede reproducir la compilation localmente fácilmente.