乐趣区

关于后端:JavaSpringBoot项目打包构建成Docker镜像的几种方式

前置阐明

  • 最为原始的打包形式
  • spring-boot-maven-plugin插件
  • jib-maven-plugin插件
  • dockerfle-maven-plugin插件

最为原始的形式

也就是应用 Docker 的打包命令去打包,麻烦,我这里不多说。

spring-boot-maven-plugin 插件打包

SpringBoot 本人内置了一个 Docker 镜像打包工具,在 spring-boot-starter-parent 中,咱们无需多余的设置。

长处:不须要写DockerFile,Spring 倡议的平安、内存、性能等问题都不须要管。

jib-maven-plugin 插件

来自 Google 的一款打包插件。

长处:不须要本地装置 Docker,也不须要写DockerFileJib 能够间接推送到指定的Docker 仓库。

dockerfle-maven-plugin 插件

须要写 DockerFile 也须要本地 Docker 环境,然而恰好是最好用的,最稳固的,最自在把控的。

长处:稳固,不受网络限度,DockerFile 本人写,自由度很高,想怎么改怎么改,集体举荐这个。

SpringBoot 打包镜像

咱们无需引入依赖,SpringBoot自带了。

打包命令:

mvn spring-boot:build-image

然而我不喜爱用命令,IDEA 都给你可视化了,何必敲命令呢?而且命令还须要设置 Maven 环境变量。

就和打 JAR 包一样,咱们点一下就能够。

然而 SpringBoot 的打包会因为网络(不通顺),而导致失败。

打包实现是这样:

咱们去查看本地镜像有没有。

运行测试一下。

说实话我运行失败了,因为我我的项目外面有一下货色它不好搞,比方微信领取的证书文件和 KEY 文件,个别的 SpringBoot 我的项目能够,然而我这个恰好不行,我须要本人写 DockerFile 去创立卷映射才好。

JIB 打包镜像

配置插件依赖:

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.toemail.smtp.ToEmailApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>3.3.1</version>
                <configuration>
                    <!--from 节点用来设置镜像的根底镜像,相当于 Docerkfile 中的 FROM 关键字 -->
                    <from>
                        <!-- 根底镜像名称(倡议应用国内公开镜像,下载速度快,更稳固) -->
                        <image>java:8u172-jre-alpine</image>
                    </from>
                    <to>
                        <!-- 镜像名称和 tag,应用了 mvn 内置变量 ${project.version},示意以后工程的 version-->
                        <image>demo:${project.version}</image>
                    </to>
                    <!-- 容器相干的属性 -->
                    <container>
                        <!--jvm 内存参数 -->
                        <jvmFlags>
                            <jvmFlag>-Xms4g</jvmFlag>
                            <jvmFlag>-Xmx4g</jvmFlag>
                        </jvmFlags>
                        <!-- 要裸露的端口 -->
                        <ports>
                            <port>8899</port>
                        </ports>
                    </container>
                </configuration>
            </plugin>

我这里用的目前最新版本。

另外,很多配置我都写了正文,如果你想理解更多能够查一下 JIB 的相干文档。

命令

mvn compile com.google.cloud.tools:jib-maven-plugin:2.3.0:dockerBuild

IDEA

报错

如果呈现这谬误:

就增加以下配置:

还是报错

如同是它这个官网仓库须要认证登录,我靠,我真不喜爱这破插件,垃圾(暗暗骂道)。

忽然解决

这个镜像,须要指定具体仓库 URL 地址的。

然而我当初这个不行,所以我要换一个阿里的仓库。

改成了这样:

<to>
  <image>registry.cn-qingdao.aliyuncs.com/jibjava/jibfirst</image>
</to>

阿里云有时候公有仓库须要明码,也能够换成其余公有仓库。

        <from>
            <image>registry.cn-qingdao.aliyuncs.com/jibjava/jibfirst</image>
            <auth>
              <username> 阿里云账号 </username>
              <password> 阿里云明码 </password>
            </auth>
          </from>

XML 标签详解

from:拉取的镜像的配置,默认为 gcr.io/distroless/java
to: 要生成的镜像的配置
image:拉取或生成的镜像名称
auth: 认证信息,别离为用户名和明码
container: 容器的属性
jvmFlgs: JVM 容器的参数,和 Dockerfile 的 ENTRYPOINT 作用雷同
mainClass: 启动类限定名
args: main 办法的传入参数
ports: 容器裸露的端口,和 Dockerfile 的 EXPOSE 作用雷同

胜利

DockerFileMaven 打包

DockerFile

FROM c9katayama/java8:latest
# 创立目录
RUN mkdir -p /dashboard
# 拷贝文件
COPY dashboard.jar /dashboard/dashboard.jar
# 裸露端口
EXPOSE 8099
# 启动命令
CMD ["java", "-jar", "/dashboard/dashboard.jar"]

DockerFile不多说,请自行学习。

依赖展现:

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.11</version>
                <dependencies>
                    <dependency>
                        <groupId>javax.activation</groupId>
                        <artifactId>javax.activation-api</artifactId>
                        <version>1.2.0</version>
                        <scope>compile</scope>
                    </dependency>
                </dependencies>
                <configuration>
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <imageTags>
                        <imageTag>${project.version}</imageTag>
                        <imageTag>latest</imageTag>
                    </imageTags>
                </configuration>
            </plugin>

然而这一段插件的 XML 别用,因为这是 rocketmq 可视化控制台的官网写的,你能够本人配置。

失常的个别插件的 XML 就这样:

        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
                <imageName>${project.artifactId}:${project.version}</imageName>
                <!-- 指定 Dockerfile 门路 -->
                <dockerDirectory>${basedir}/docker</dockerDirectory> 
                <!-- 这里是复制 jar 包到 docker 容器指定目录配置,也能够写到 Docokerfile 中 -->
                <resources>
                    <resource>
                        <targetPath>/ROOT</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>

其余配置能够自行浏览器搜寻一下:docker-maven-plugin配置项

构建命令

mvn package

尝试打包

我这里间接 IDEA 点击打包,厌恶命令。

留神:须要本地有 Docker,并且开启近程连贯,WindowsDocker装置小简上一篇文章写过的,能够看看,Linux的没写。

好用多了,一次胜利。

还是这个最好用,举荐!!!

总结

小简抉择的是最初一个,第一个也还行吧,然而 Google 那个不须要本地有 Docker 环境,第一个我还是开着魔法 (梯子) 打包的,最初一个挺好的。

看状况抉择的,很久没更新啦!越来越懒了,嘿嘿,下篇再见。

退出移动版