记一次Docker发布idea中的SpringBoot

272 阅读4分钟

最近研究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窗口右边那一列:

图1

有的同学可能没有这个,我去百度了下:依次点击idea工具栏的 View->Tool Windows->Maven(windows版本应该叫Maven Project):

图2

到这里就差不多可以打包了,网上说依次点击图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>

再次重复第二步的操作,妈耶,成了~  哈哈哈哈哈哈哈哈哈哈哈哈哈嗝

结语

折腾了很久,终于是搞出来了,我还是太菜了,而且还忙,都不能细细研究那些错误的原因,有时间了再去好好看看吧,写得不好,有什么错误欢迎大家指正,谢谢!