各位开发者大家好,
我是软件开发新手,期待过渡到软件开发。
我正在学习新的技能和工具来扩展规模,并且遇到了 DOCKER 和 KUBERNETES
我已经使用 Spring Boot、Java 和 MYSQL 完成了我的后端,我只是想知道如何以工业实时方式对 Spring Boot 应用程序进行 dockerize,以便掌握它的窍门。
要成像的东西
环境:JAVA 17
依赖项:POM.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.greatlearning.employeemanagementservice</groupId>
<artifactId>employeemanagementservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>employeemanagementservice</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!-- spring security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
应用程序属性:
server.port=8082
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/empdb
spring.datasource.username=root
spring.datasource.password=*s12
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.main.allow-bean-definition-overriding=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
这是我做过的一个员工管理项目,有简单的CRUD操作。如果有人可以指导我完成 Docker 镜像设置,那将会很有帮助。
请原谅,如果在堆栈溢出中发布此类问题是不合适的。
最佳答案
尝试以下 Dockerfile。它执行多阶段构建,在第一阶段,您的代码被编译为可执行文件。然后,在下一阶段,仅复制运行应用程序所需的部分,以便您的 Docker 镜像的大小比复制 Docker 镜像中所有未编译和编译的代码要小。有关多阶段构建的更多信息,请参阅 official documentation或无数的互联网教程之一。
FROM maven:3.8-openjdk-17 as maven
WORKDIR /app
COPY ./pom.xml .
RUN mvn dependency:go-offline
COPY ./src ./src
RUN mvn package -DskipTests=true
WORKDIR /app/target/dependency
RUN jar -xf ../employeemanagementservice.jar
FROM ibm-semeru-runtimes:open-17-jre-centos7
ARG DEPENDENCY=/app/target/dependency
COPY --from=maven ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=maven ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=maven ${DEPENDENCY}/BOOT-INF/classes /app
CMD java -server -Xmx1024m -Xss1024k -XX:MaxMetaspaceSize=135m -XX:CompressedClassSpaceSize=28m -XX:ReservedCodeCacheSize=13m -XX:+IdleTuningGcOnIdle -Xtune:virtualized -cp app:app/lib/* com.greatlearning.employeemanagementservice.Application
我做了以下假设:
- 您的构建工件名为
employeemanagementservice.jar
。在 Maven 构建后检查您的target
目录进行验证。我总是在 pom.xml 中这样配置
<build>
<finalName>${project.artifactId}</finalName>
</build>
您在 CI/CD 管道中运行测试,并且不想在 Docker 镜像构建步骤中运行它们。如果您想运行测试,则必须从
RUN mvn package -DskipTests=true
命令中删除-DskipTests=true
。您的主类名为
Application
,它位于com.greatlearning.employeemanagementservice
包中。如果没有,请在 DockerCMD
命令中更改它。您希望您的服务最多使用 1GB RAM。如果没有,请将
-Xmx1024m
更改为您想要的数量。其他java
参数用于优化目的,您可以在线查找它们。
关于mysql - 如何为 Spring Boot 应用程序创建 Dockerfile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74846326/