Tengo un archivo .war de mi aplicación Java y me gustaría implementarlo en un contenedor Docker.
Mi Dockerfile se ve así:
FROM java:8
EXPOSE 8080
ADD /App.war app.war
ENTRYPOINT ["java", "-jar", "app.war"]
Tengo mi App.war
en el mismo directorio.
Cuando quiero ejecutarlo con el siguiente comando:
docker run -p 8080:8080 -t app
lanza la siguiente excepción:
no main manifest attribute, in app.war
Sin embargo, cuando inspecciono app.war, hay un manifiesto en /META-INF/MANIFEST.MF que indica las siguientes opciones:
Manifest-Version: 1.0
Start-Class: com.package.app.AppMainClass
Spring-Boot-Classes: WEB-INF/classes/
Spring-Boot-Lib: WEB-INF/lib/
Spring-Boot-Version: 1.4.0.RELEASE
Main-Class: org.springframework.boot.loader.WarLauncher
Por lo que entiendo, el mensaje de error indica que falta un atributo de clase principal en el manifiesto (lo cual es imposible porque está allí). También intenté agregar la clase real como Main-Class.
Eso llevó al mismo error.
¿Puede alguien ayudarme a volver a encarrilarme?
En primer lugar, no cree un proyecto de arranque de primavera como WAR. Solo necesitaría WAR si tuviera algún proyecto antiguo que lo obligara a implementar la aplicación en un servidor web / contenedor de servlets. Deberá eliminar la lógica relacionada con la guerra de su script de compilación.
Segundo. Asegúrese de estar construyendo el proyecto correctamente. Si es gradle, debe construirlo con ./gradlew build
, para uso de maven mvn package
. Eso empaquetará su archivo como un uberjar, incluidas todas las dependencias necesarias y la estructura de archivo adecuada.
Encuentre más detalles sobre cómo poner una aplicación de arranque de primavera en Docker en las guías del usuario .
Si y solo si por alguna ocurrencia extraña necesita construirlo como WAR y ejecutarlo como un archivo ejecutable, asegúrese de hacerlo usando el complemento war proporcionado por Spring Boot (no el complemento war incorporado). Esa es la única forma funcional de crear un archivo de guerra ejecutable.
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras