Cześć wszystkim, mam projekt w Springu i chciałbym nauczyć się przy nim Dockera i Docker Compose. Jednak zdecydowanie robię coś nie tak.
Próbowałem już na wiele sposobów i jeśli udało mi się rozwiązać podany poniżej problem, to pojawiał się następny w postaci braku możliwości połączenia się z bazą danych (nierozpoznany host) lub musiałem mieć uruchomionego XAMPP'a żeby móc stworzyć obraz Dockera.
Obecna struktura plików projektu:
Dockerfile:
FROM maven:3.8.3-openjdk-17 AS build
COPY src /home/app/src
COPY pom.xml /home/app
COPY src/main/resources/application-docker.properties /home/app/application.properties
RUN mvn -f /home/app/pom.xml clean package
EXPOSE 8080
ENTRYPOINT ["java","-jar","/home/app/target/spring_rest_docker.jar"]
docker-compose.yml:
version: "3.8"
services:
spring-app:
build: .
restart: always
ports:
- '8080:8080'
networks:
- spring-net
environment:
DB_ENDPOINT: spring-mysqldb
DB_PORT: 3306
DB_SCHEMA: crs_database
DB_USER: admin
DB_PASS: root
depends_on:
- spring-mysqldb
volumes:
- .m2:/root/.m2
- ./application-docker.properties:/home/app/application.properties
spring-mysqldb:
image: "mysql:8.0"
restart: always
ports:
- '3306:3306'
networks:
- spring-net
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: crs_database
MYSQL_USER: admin
MYSQL_PASSWORD: root
networks:
spring-net:
application-docker.properties
spring.datasource.url=jdbc:mysql://${DB_ENDPOINT}:${DB_PORT}/${DB_SCHEMA}?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASS}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.sql.init.mode=always
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.servlet.multipart.max-file-size=15MB
spring.servlet.multipart.max-request-size=15MB
crs.app.jwtSecret=xxxxx
crs.app.jwtExpirationMs=86400000
Przy obecnej zawartości plików i ich strukturze, otrzymuje następujące błędy:
39.35 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution [Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Failed to parse the host:port pair '${DB_ENDPOINT}:${DB_PORT}'.] [n/a]
39.35 Caused by: java.lang.NumberFormatException: For input string: "${DB_PORT}"
39.35 at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
39.35 at java.base/java.lang.Integer.parseInt(Integer.java:654)
39.35 at java.base/java.lang.Integer.parseInt(Integer.java:786)
39.35 at com.mysql.cj.conf.ConnectionUrlParser.parseHostPortPair(ConnectionUrlParser.java:499)
39.35 ... 80 more