springboot 项目使用 gradle-jib 插件制作镜像及运行容器

本文详细介绍了如何使用SpringBoot和Docker进行应用部署,包括在IDEA中使用Gradle构建工具,配置JIB插件上传镜像至阿里云,以及通过docker-compose运行容器的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   ## 如果springboot配置jdbc时访问不了mysql;参考:docker学习(八) docker-compose 启动一个springboot 连接mysql_docker-compose springboot mysql jpa-优快云博客

1. 使用阿里云容器镜像服务 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台  

           先[创建镜像仓库]:例如个人的公开仓库 registry.cn-shanghai.aliyuncs.com/starxin/docker-jib:1.0

2. 在idea中使用gradle构建工具,在配置文件build.gradle中添加jib插件等信息

plugins {
    id 'java'
    id 'idea'
    id "io.spring.dependency-management" version "1.0.8.RELEASE"
    id 'org.springframework.boot' version '2.7.5.RELEASE'
    id "com.google.cloud.tools.jib" version "3.0.0"
}

.......其它配置......

jib {
    from {
        // image = 'registry.cn-shanghai.aliyuncs.com/starxin/docker-jib:1.0'
        image = "eclipse-temurin:11-jre-focal"
        platforms {
            platform {
                architecture = 'arm64'  //部分国产操作系统用arm64
                os = 'linux'
            }
        }
    }
    to {
        image = 'registry.cn-shanghai.aliyuncs.com/MyRegistry/projectM'
        tags = ["latest", "${project.version}".toString()]
        allowInsecureRegistries = true
        auth {
            username = '登录账号'
            password = '登录密码'
        }
    }
    container {
        creationTime='USE_CURRENT_TIMESTAMP'
        jvmFlags = ['-Djava.security.egd=file:/dev/./urandom', '-Dspring.profiles.active=prod', '-Dfile.encoding=utf-8', '-Duser.timezone=GMT+08']
        mainClass = 'com.xxx.RunApplication'
        ports = ['8080']
    }
}

注释:jvmFlags 配置中

'-Djava.security.egd=file:/dev/./urandom'   -  SecureRandom在java各种组件中使用广泛,可以加快随机数产生过程;建议添加

'-Dspring.profiles.active=prod'   -执行springboot项目使用配置 application-prod.yml;可选

'-Dfile.encoding=utf-8'  - 如果有下载文件代码,不加此句容易出现中文乱码;可选

'-Duser.timezone=GMT+08'  - Java获取时间与系统时间相差8小时的解决方法;可选


注意:com.google.cloud.tools.jib version="2.0.0" 时....容器创建时间用:creationTime='USE_CURRENT_TIMESTAMP'
           com.google.cloud.tools.jib version="1.x"    时....容器创建时间用:useCurrentTimestamp=true

具体版本对应参数参考 - https://github.com/GoogleContainerTools/jib/blob/master/jib-gradle-plugin/README.md

3. 配置完上面build.gradle,会在构建工具中出现jib插件,点击jib可以将本地jar打包成镜像文件上传到阿里云镜像仓库;

    你可以在自己的服务器中搭建docker镜像仓库,然后上传到自己的docker镜像仓库中

4. 使用docker-compose运行容器,在 linux目录/root/home/docker下添加 docker-compose.yml ,内容如下:

version: '2'
services:
  projectM:
    image: registry.cn-shanghai.aliyuncs.com/MyRegistry/projectM
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 8080:8080
    restart: always

5.使用docker-compose命令运行容器;

cd /root/home/docker
docker images                     #查看容器列表
docker pull registry.cn-shanghai.aliyuncs.com/MyRegistry/projectM:[镜像版本号]  #从阿里云拉取镜像到本地服务器
docker-compose stop projectM      #停止运行的容器
docker-compose rm -f projectM     #强制删除容器
docker-compose up -d projectM     #后台方式运行容器
docker image rm $(docker image ls -a -q)  #删除无效的容器
docker images                     #查看容器列表
docker-compose logs -f projectM   #打印实时日志,可以在随时进入执行,查看运行的容器的日志信息
<think>好的,我现在需要帮助用户了解如何将Spring Boot应用构建成Docker镜像。根据用户提供的引用内容,我需要整理出不同的方法,并确保符合格式要求。首先,我需要回顾用户提到的几种方法:传统的Dockerfile、多阶段构建、Jib插件Spring Boot Maven插件。同时,用户提到分层构建可以减小镜像大小,这也是需要强调的。 首先,传统Dockerfile方法是最基础的方式。我需要写出Dockerfile的内容,并解释每个步骤的作用,比如基础镜像、复制jar包、入口点等。然后,用户可能需要知道如何构建和运行镜像的命令,比如docker build和docker run。 接下来是多阶段构建,这种方法可以优化镜像大小。这里需要分两个阶段:构建阶段和运行阶段。在构建阶段使用Maven基础镜像来打包应用,生成jar文件;然后在运行阶段仅复制jar文件到轻量级的JRE镜像中。这样可以避免将构建工具打包进最终镜像,从而减小体积。 然后是Jib插件,这是Google提供的工具,不需要Dockerfile,直接在Maven或Gradle中配置即可。需要给出pom.xml中添加的插件配置,以及构建命令。同时说明Jib的优点,比如自动分层构建,优化依赖项,提升构建速度。 最后是Spring Boot Maven插件,这是Spring官方支持的方法。同样需要配置插件,并且可以使用spring-boot:build-image命令来构建镜像。这里需要强调分层构建的优势,比如将依赖、资源和应用代码分开,利用Docker的缓存机制,减少传输时间和存储空间。 在整理这些方法时,要确保每个步骤都清晰,代码块正确使用反引号,并注意LaTeX格式是否正确。同时,用户可能需要了解不同方法的优缺点,比如传统Dockerfile的灵活性,多阶段构建的优化,Jib的便捷性,以及Spring Boot插件的官方支持。 相关问题部分需要生成与主题相关的问题,比如如何选择构建方式、分层构建原理、优化镜像大小的方法、不同构建方式的优缺点比较等。要确保问题覆盖用户可能感兴趣的方面,帮助用户进一步深入学习。 最后,检查引用是否正确添加在对应的位置,比如引用[^1]和[^2]的来源,确保没有遗漏。同时,确保整个回答结构符合用户提供的系统级指令,使用正确的中文表达,避免技术术语使用错误。</think>### 如何将Spring Boot应用构建为Docker镜像 #### 1. **传统Dockerfile方式** 这是最基础的构建方法,通过编写Dockerfile定义构建步骤: ```dockerfile FROM openjdk:17-jdk-slim COPY target/*.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"] ``` **操作步骤**: 1. 使用Maven打包应用:`mvn clean package` 2. 构建镜像:`docker build -t my-spring-app .` 3. 运行容器:`docker run -p 8080:8080 my-spring-app` **缺点**:生成的镜像包含完整的JDK和构建环境,可能导致镜像体积过大(通常几百MB)。 --- #### 2. **多阶段构建优化** 通过多阶段构建分离编译和运行环境,减少最终镜像体积: ```dockerfile # 第一阶段:构建应用 FROM maven:3.8.6-openjdk-17 AS build COPY src /app/src COPY pom.xml /app RUN mvn -f /app/pom.xml clean package # 第二阶段:运行环境 FROM openjdk:17-jdk-slim COPY --from=build /app/target/*.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"] ``` **优点**:最终镜像仅包含运行所需的JRE和JAR文件,体积可减少约40%。 --- #### 3. **使用Jib插件(无需Dockerfile)** Google开源的Jib插件可直接通过Maven/Gradle构建镜像: ```xml <!-- pom.xml中配置 --> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>3.3.1</version> <configuration> <to> <image>my-registry/my-spring-app</image> </to> </configuration> </plugin> ``` **构建命令**:`mvn compile jib:build` **优势**: - 自动分层优化(依赖库、资源文件、应用代码分离) - 无需本地安装Docker环境 - 支持增量构建,速度提升50%以上 --- #### 4. **Spring Boot官方分层构建** Spring Boot 2.3+ 原生支持分层镜像构建: ```xml <!-- pom.xml中启用分层 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <enabled>true</enabled> </layers> </configuration> </plugin> ``` **构建命令**:`mvn spring-boot:build-image` **效果**: - 镜像层结构示例: ```bash ├──依赖层 (约80MB) ├──资源层 (约5MB) └──应用层 (约15MB) ``` - 当仅修改业务代码时,只需重新构建最上层,传输量减少90% --- ### 方法对比 | 方法 | 构建速度 | 镜像体积 | 复杂度 | 适用场景 | |--------------------|----------|----------|--------|--------------------------| | 传统Dockerfile | 慢 | 大 | 低 | 简单项目/快速验证 | | 多阶段构建 | 中 | 中 | 中 | 需要优化体积的正式环境 | | Jib插件 | 快 | 小 | 低 | 云原生/CI-CD流水线 | | Spring Boot分层构建 | 快 | 最小 | 低 | Spring Boot 2.3+项目 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星梦天河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值