Jib构建镜像问题从定位到深入分析,掌握这套精编Java高级面试题解析

关于Jib插件

在Maven工程中可以使用Jib插件将当前Java工程构建成Docker镜像,详情请参考:

  1. 《Docker与Jib(maven插件版)实战》;

  2. 《Jib使用小结(Maven插件版)》;

环境信息

  1. 操作系统:macOS Mojave 10.14.6 (18G103)

  2. JDK:10.14.6 (18G103)

  3. Docker:10.14.6 (18G103)

  4. SpringBoot:2.1.8.RELEASE

  5. Jib插件版本:1.6.1

源码下载

为了重现问题,我将出现问题的SpringBoot工程上传到GitHub,地址和链接信息如下表所示:

| 名称 | 链接 | 备注 |

| :-- | :-- | :-- |

| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |

| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |

| git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |

这个git项目中有多个文件夹,本章的应用在jib-error-demo文件夹下,如下图红框所示:

在这里插入图片描述

问题:

  1. 在pom.xml文件所在目录执行命令mvn clean compile -U,镜像可以构建成功,但是控制台输出了警告信息,如下图:

在这里插入图片描述

  1. 尝试用此镜像创建容器,行命令docker run --name=test bolingcavalry/hellojib:0.0.1-SNAPSHOT,报错如下:

CN0014005932:~ zhaoqin$ docker run --name=test bolingcavalry/hellojib:0.0.1-SNAPSHOT

Error: Could not find or load main class ${start-class}

  1. docker ps -a查看容器信息如下,只能看到状态是"退出",别的没啥了:

CN0014005932:~ zhaoqin$ docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

d618f6588821 bolingcavalry/hellojib:0.0.1-SNAPSHOT “java -Xms4g -Xmx4g …” 4 minutes ago Exited (1) 4 minutes ago test

  1. 不甘心,用命令docker ps -a --no-trunc查看未截断的容器信息:

CN0014005932:~ zhaoqin$ docker ps -a --no-trunc

CONTAINER ID

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

                                                 IMAGE                                   COMMAND                                                                           CREATED             STATUS                     PORTS               NAMES

d618f6588821f00d3bd0b67a85ff92988b90dfff710370c9d340d5c544c550af bolingcavalry/hellojib:0.0.1-SNAPSHOT “java -Xms4g -Xmx4g -cp /app/resources:/app/classes:/app/libs/* ${start-class}” 7 minutes ago Exited (1) 7 minutes ago test

  1. 这次有新发现,容器启动时执行命令是java -Xms4g -Xmx4g -cp /app/resources:/app/classes:/app/libs/* s t a r t − c l a s s , 怪 哉 ! 这 个 {start-class},怪哉!这个 startclass{start-class}是什么?我们来看一个正常镜像的启动命令:

java -Xms4g -Xmx4g -cp /app/resources:/app/classes:/app/libs/* com.bolingcavalry.jiberrordemo.JibErrorDemoApplication

如上所示,com.bolingcavalry.jiberrordemo.JibErrorDemoApplication是main方法所在类,此命令可以正常运行JibErrorDemoApplication类的main方法;

6. 小结问题:容器启动时执行java命令,把${start-class}作为参数传给java,导致java无法处理此参数,所以进程报错,导致容器退出;

问题原因

此问题的原因很简单:java工程中带有main方法的类不止一个,去查看jib-error-demo工程的代码,发现Utils.java中果然有个main方法:

public class Utils {

public static String time(){

return new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).format(new Date()).toString();

}

public static void main(String[] args){

System.out.println(time());

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值