一
最近研究Docker,准备打包个springboot的项目试试,由于本人实在是太菜了,期间遇到了很多坑,这里先记录下吧。先简单说下已有的东西:
java-------1.8.0_211
maven------3.6.1
springboot-2.1.6.RELEASE
idea-------我的是mac环境,不过windows应该也是一样的。
docker-----linux下面咯
二
先说下maven打包这边吧,由于不会用命令打包,我就直接用的idea的maven,就是idea窗口右边那一列:
有的同学可能没有这个,我去百度了下:依次点击idea工具栏的 View->Tool Windows->Maven(windows版本应该叫Maven Project):
到这里就差不多可以打包了,网上说依次点击图1中的clean-》compile-》package就好了,果然点击完后到项目的target目录下去看一眼,嘿,有了jar诶,
我这个开心啊,立马传到linux上面去打包:
编写Dockerfile:
FROM java:8
MAINTAINER author author@163.com
VOLUME /tmp
ADD payment-service-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
介绍一下:
FROM---------表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载
MAINTAINER---指定维护者的信息
VOLUME-------VOLUME 指向了一个/tmp的目录,由于SpringBoot使用内置的Tomcat容器,Tomcat默认使用/tmp作为工作目录。这个命令的效果是:
在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
ADD----------拷贝文件并且重命名(前面是上传jar包的名字,后面是重命名)
RUN----------每条run指令在当前基础镜像执行,并且提交新镜像
ENTRYPOINT---为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT
然后 "docker build -t payment ."
注意:后面末尾有一个空格和一个“.”,payment是创建的镜像的名字,“.”表示当前目录
"docker run -d -p 8081:8081 payment"
这样我们的镜像就制作完成了,是不是以为到这就完了?对没错你们到这里就可以了。
三
但我不一样啊,我是谁啊,IT届4000年难遇的老白菜啊,我的镜像启动后无法访问,找了半天的原因发现我的jar包只有7k,打过包的都知道这完全不可能啊,
百度了会原因,发现是我maven pom的原因,我忘记加maven plugin了,能找到原因就好,加上就是了嘛:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
重复clean-》compile-》package,打包完发现还是只有7k,我又哼哧哼哧去百度了,发现springboot项目打包是需要指定mian程序入口的,
然后我的pom就改成了下面这样:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!--注意,此处必须是main()方法对应类的完整路径 -->
<mainClass>com.wjc.paymentservice.PaymentServiceApplication</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
再次clean-》compile-》package,喔唷~ 48m了,这就对了嘛,赶紧上docker,不负众望的报错来了:
java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories.
If you are using a custom packaging, make sure that file is correct.
意思大概还是pom的原因吧,我又找了另外一篇文章把pom改成这样:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
<mainClass>com.wjc.paymentservice.PaymentServiceApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
再次重复第二步的操作,妈耶,成了~ 哈哈哈哈哈哈哈哈哈哈哈哈哈嗝
结语
折腾了很久,终于是搞出来了,我还是太菜了,而且还忙,都不能细细研究那些错误的原因,有时间了再去好好看看吧,写得不好,有什么错误欢迎大家指正,谢谢!