mysql - 如何为 Spring Boot 应用程序创建 Dockerfile?

标签 mysql spring-boot docker kubernetes

各位开发者大家好,

我是软件开发新手,期待过渡到软件开发。

我正在学习新的技能和工具来扩展规模,并且遇到了 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

我做了以下假设:

  1. 您的构建工件名为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 包中。如果没有,请在 Docker CMD 命令中更改它。

  • 您希望您的服务最多使用 1GB RAM。如果没有,请将 -Xmx1024m 更改为您想要的数量。其他java参数用于优化目的,您可以在线查找它们。

  • 关于mysql - 如何为 Spring Boot 应用程序创建 Dockerfile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74846326/

    相关文章:

    "="的 MySQL 通配符 - 有没有

    spring-boot - 在 Spring Boot 实体类中实现可序列化

    php - 如果用户选择级联的某个选项,则删除带有文本输入的选择标签

    java - 如何在不修改应用程序(xxx.jar)的情况下使用类路径上的额外文件运行 Spring Boot 应用程序

    java - 如何防止 Controller 方法在 Chrome 浏览器的 Spring Boot 中运行两次?

    python - Dockerfile,如何减小更改层的大小?

    postgresql - Docker容器的可靠性

    Docker Traefik 和 Letsencrypt 通配符

    php - 如何根据来自mysql的动态信息设置css的宽度

    php - 登录系统: $_POST ['username' ] and $_POST ['password' ] are always empty