EsupPortail / esup-mdw-pegase

Esup Pégase mon dossier web
2 stars 2 forks source link

ClassNotFoundException #14

Open ohacy opened 2 years ago

ohacy commented 2 years ago

Bonjour, Dans le dockerfile, quel doit être la valeur de l'ENTRYPOINT ?

En laissant 'fr.univlorraine.blank.Application', la class n'est pas trouvée lors du run de l'image docker.

Caused by: java.lang.ClassNotFoundException: fr.univlorraine.blank.Application

Si je remplace la classe par 'fr.univlorraine.mondossierweb.Application', java n'arrive pas à parser la class, voici les logs du run de l'image :

2021-11-30 15:24:51.487 user:NO_USER     INFO 1 --- [           main] f.u.mondossierweb.Application            : Starting Application on mdw-75bc66b4cc-pnz7q with PID 1 (/app started by root in /)
2021-11-30 15:24:51.489 user:NO_USER     INFO 1 --- [           main] f.u.mondossierweb.Application            : No active profile set, falling back to default profiles: default
2021-11-30 15:24:51.490 user:NO_USER    DEBUG 1 --- [           main] o.s.boot.SpringApplication               : Loading source class fr.univlorraine.mondossierweb.Application
2021-11-30 15:24:51.546 user:NO_USER    DEBUG 1 --- [           main] o.s.b.c.c.ConfigFileApplicationListener  : Loaded config file 'file:/app/application.properties' (classpath:/application.properties)
2021-11-30 15:24:51.911 user:NO_USER     WARN 1 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [fr.univlorraine.mondossierweb.Application]; nested exception is java.lang.IllegalStateException: Failed to introspect annotated methods on class org.springframework.boot.web.servlet.support.SpringBootServletInitializer
2021-11-30 15:24:51.917 user:NO_USER    DEBUG 1 --- [           main] .c.l.ClasspathLoggingApplicationListener : Application failed to start with classpath: unknown
2021-11-30 15:24:51.927 user:NO_USER    ERROR 1 --- [           main] o.s.boot.SpringApplication               : Application run failed

Le contenu du Dockerfile :

FROM maven:3.8.1-jdk-11 AS builder
WORKDIR /build
COPY pom.xml /build/
COPY src /build/src
COPY frontend /build/frontend
RUN mvn -Pmaven-frontend -Pproduction --batch-mode --errors --show-version package

FROM openjdk:11-jdk-slim
VOLUME /tmp
COPY --from=builder /build/target/webapp/WEB-INF/lib /app/lib
COPY --from=builder /build/target/webapp/META-INF /app/META-INF
COPY --from=builder /build/target/webapp/WEB-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","fr.univlorraine.mondossierweb.Application"] 

Merci par avance, Cyril Ohanian, PC-SCOL

bquiller commented 2 years ago

Bonjour,

Voici mon DockerFile fonctionnel : FROM maven:3-jdk-11 AS builder WORKDIR /build COPY pom.xml /build/ COPY src /build/src COPY frontend /build/frontend RUN --mount=type=cache,target=/root/.m2/repository mvn -Pmaven-frontend -Pproduction --batch-mode --errors --show-version package

FROM openjdk:11-jdk-slim VOLUME /tmp COPY --from=builder /build/target/webapp/WEB-INF/lib /app/lib COPY --from=builder /build/target/webapp/META-INF /app/META-INF COPY --from=builder /build/target/webapp/WEB-INF/classes /app ENTRYPOINT ["java","-cp","app:app/lib/*","fr.univlorraine.mondossierweb.Application"]

Mais j'utilise docker-compose après ainsi : version: '3' services: esup-mdw: build: . image: unimes/esup-mdw:latest container_name: esup-mdw ports:

cdubois54 commented 2 years ago

Bonjour,

toutes mes excuses car le dockerfile n'étant pas fonctionnel, il n'aurait pas dû être publié sur git, ni livré. C'est un reliquat et une base de travail pour une future version.

Cordialement

pippobimbo commented 2 weeks ago

Bonjour,

Je rebondis sur ce sujet quelques années après car j'essaie de mettre en place "mondossierweb" au sein de notre établissement.

Je ne suis pas très doué avec Docker mais j'ai essayé de m'inspirer de vos échanges afin d'avoir un Dockerfile fonctionnel:

# Stage that builds the application, a prerequisite for the running stage
FROM maven:3.8.5-openjdk-17-slim AS build
RUN curl -sL https://deb.nodesource.com/setup_18.x | bash -
RUN apt-get update -qq && apt-get install -qq --no-install-recommends nodejs

# Stop running as root at this point
RUN useradd -m myuser
WORKDIR /usr/src/app/
RUN chown myuser:myuser /usr/src/app/
USER myuser

# Copy pom.xml and prefetch dependencies so a repeated build can continue from the next step with existing dependencies
COPY --chown=myuser pom.xml ./
RUN mvn dependency:go-offline -Pproduction

# Copy all needed project files to a folder
COPY --chown=myuser:myuser src src
COPY --chown=myuser:myuser frontend frontend
COPY --chown=myuser:myuser package.json ./

# Build the production package, assuming that we validated the version before so no need for running tests again
RUN mvn clean package -DskipTests -Pproduction

# Running stage: the part that is used for running the application
FROM tomcat:jdk17
COPY --from=build /usr/src/app/target/*.war /usr/local/tomcat/webapps/ROOT.war
EXPOSE 8080
WORKDIR /usr/app/
ENTRYPOINT ["catalina.sh", "run"]

L'image a été créée avec succès.

J'ai ajouté la start-class ci-dessous dans le fichier "pom.xml" car j'avais une erreur par la suite:

<properties>
        <start-class>fr.univlorraine.mondossierweb.Application</start-class>
        <revision>2.2.1</revision>
        <sha1></sha1>
        <changelist>-SNAPSHOT</changelist>
        <java.version>17</java.version>
        <!-- <vaadin.version>24.0.5</vaadin.version> -->
        <vaadin.version>24.3.3</vaadin.version>
        <gson-fire-version>1.8.4</gson-fire-version>
        <swagger-core-version>1.5.24</swagger-core-version>
        <okhttp-version>4.9.3</okhttp-version>
        <gson-version>2.8.6</gson-version>
        <commons-lang3-version>3.10</commons-lang3-version>
        <javax-annotation-version>1.3.2</javax-annotation-version>
        <h2.version>2.1.210</h2.version>
        <sonar.qualitygate.wait>true</sonar.qualitygate.wait>
        <skipITs>false</skipITs>
        <flyway.version>8.5.13</flyway.version>
    </properties> 

J'ai ensuite utilisé le docker-compose ci-dessous:

services:

  mariadb:
    image: mariadb:10.8.2
    restart: always
    container_name: mariadb
    volumes:
      - /home/thierry/docker/mariadb:/var/lib/mysql
    environment:
      - MARIADB_ROOT_PASSWORD=mypass
      - MARIADB_DATABASE=mdw
      - MARIADB_ROOT_HOST=%
    networks:
      - app

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    container_name: phpmyadmin
    ports:
      - 8000:80
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mariadb
    depends_on:
      - mariadb
    networks:
      - app

  mdw-pegase:
    image: esup-mdw:latest
    container_name: mdw-pegase
    ports:
      - 8080:8080
    volumes:
      - /home/thierry/docker/esup-mdw-pegase:/config
    environment:
      JAVA_OPTS: -Dspring.config.location=file:/config/application.properties
    depends_on:
      - mariadb
    networks:
      - app

networks:
  app:
    driver: bridge

J'ai ensuite déposé le fichier "application.properties" dans le répertoire "config" avec la chaine de connexion ci-dessous:

# MySQL
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://mariadb:3306/mdw?serverTimezone=Europe/Paris
spring.datasource.username = root
spring.datasource.password = mypass

Et c'est donc au moment du lancement du container "mdw-pegase" que les ennuies comment avec cette erreur:

java.sql.SQLException: Access denied for user 'root'@'172.18.0.4' (using password: YES)

J'arrive bien à me connecter sur la BdD MariaDB avec root/mypass depuis PHPMyAdmin et le root semble avoir les accès requis:

image

Est-ce que quelqu'un aurait déjà rencontré ce problème svp?

Merci par avance pour vos réponses, Thierry

cdubois54 commented 6 days ago

Bonjour,

Tout me semble correct. Pouvez-vous essayer de supprimer le networks (il me semble que ça fonctionnait sur mon Docker en local sans cela) ?

Cordialement

pippobimbo commented 5 days ago

Bonjour,

Après m'être acharné sur MariaDB, j'ai tout recommencé pas à pas et, en particulier, j'ai refait un fichier "application.properties" contenant les mêmes informations que le premier et cela a fonctionné.

En conclusion, j'avais dû ajouter un caractère spécial pour le mot de passe "root" dans le fichier ...

Je suis bien redirigé vers l'URL du CAS qui n'est pas encore configuré. Bref, je ne suis pas sorti de l'auberge ;)

Merci beaucoup pour votre réponse ! Thierry

cdubois54 commented 3 days ago

Bonjour,

De rien.

Si nécessaire, vous pouvez essayer la dernière version du docker-compose.yml : https://github.com/EsupPortail/esup-mdw-pegase/blob/master/docker-compose.yml

Elle se base sur une image en 2.2.2 Il faut donc précédemment lancer un : docker build -t esup-mdw-pegase:2.2.2 .

Puis, à la racine du projet, il faut créer un dossier ".docker". Dans ce répertoire créer 2 dossiers :

Dans le répertoire "esup-mdw-pegase" créer un fichier "application.properties" basé sur src/main/resources/application-example.properties

Indiquer la configuration à utiliser dans ce fichier. Pour la configuration de la bdd indiquer :

spring.datasource.url = jdbc:mysql://mariadb:3306/mdwpegase?serverTimezone=Europe/Paris
spring.datasource.username = root
spring.datasource.password = mypass

Enfin, lancer les conteneurs via la commande : docker-compose -f docker-compose.yml -p mdw-pegase up -d

On accède à PhpMyAdmin via : http://localhost:8000/ On accède à MDW via : http://localhost:8080/

Si MDW ne démarre pas à cause d'une bdd non accessible, com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure ... Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure ... Caused by: java.net.ConnectException: Connection refused c'est potentiellement dû au fait que la base n'a pas eu le temps de se créer avant que MDW se lance. Il suffit donc de restart le conteneur de mdw-pegase

Cordialement

pippobimbo commented 2 days ago

Bonjour,

Pour l'instant, je suis arrêté à la version 2.2.1 et cela fonctionne désormais parfaitement.

N'ayant pas accès pour l'instant au CAS, j'ai inclus dans le docker-compose l'image "casserver" d'Apereo et j'ai utilisé le "compte en dur" : casuser/Mellon avec une règle passante pour "esup-mdw-pegase"...

La prochaine étape sera le passage en environnement de production et je sens que cela ne va pas être une partie de plaisir.

En tout cas, merci pour votre travail et vos réponses.

Thierry