dockerfile-maven-plugin打包Docker镜像

dockerfile-maven-plugin实际上就是帮我们执行了mvn package、docker build、docker tag和docker push,是可以直接用shell命令的。


首先,修改项目POM文件,引入dockerfile-maven-plugin

    <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>dockerfile-maven-plugin</artifactId>
        <version>1.4.10</version>
        <executions>
            <execution>
                <id>default</id>
                <goals>
                    <goal>build</goal>
                    <goal>push</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <username>138*******6</username>
            <password>*******</password>
            <repository>registry.cn-hangzhou.aliyuncs.com/kojima/${project.artifactId}</repository>
            <tag>${project.version}</tag>
            <buildArgs>
                <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
            </buildArgs>
        </configuration>
    </plugin>

这里解释以下,goal中的build会随着mvn package一同被执行,所以如果平时想单独打包可以暂时注释掉这个。
下边的用户名密码和仓库都是阿里云仓库账户,可自己申请,还有另一种配置账户的方式,在maven的setting.xml中,从运维安全角度来讲应该是使用这种,可查阅https://github.com/spotify/dockerfile-maven/blob/master/docs/authentication.md
版本号我们用maven上写好的版本号,以区分镜像版本,JAR_FILE会在Dockerfile中使用,Dockerfile位置就在项目的根目录下:
Dockerfile

FROM java:8
EXPOSE 8080
ARG JAR_FILE
ADD ${JAR_FILE} /app.jar
ENTRYPOINT ["java", "-jar","/app.jar"]

项目上我们需要配置的就是这些,接下来还有一些环境配置。
我们要知道docker默认的镜像库由于墙的原因我们是上不去的,所以需要更改镜像地址,而插件默认使用的是本地的docker环境,而如果你本地没有安装docker怎么办?实际上插件默认会访问本地2375端口服务,如果想要访问服务器的配置,在环境变量中配置DOCKER_HOST参数,内容为tcp://XX.XX.XX.XX:2375,当然一般来说这都是在服务器上执行的(2375有漏洞,一般不会对外网开放的),如果想要本地体验一下,那就要自行安装了。新版的Docker Desktop需要安装WSL2,如果没有,启动的时候会报错,我们需要右键任务栏图标,点击setting,取消勾选,然后重启,镜像地址在Docker Engine中可以修改。
Docker Desktop
配置完成后,分别执行mvn package和mvn dockerfile:push即可。

使用springboot自带的plugin打包

从springboot 2.4开始,springboot也支持docker打包。

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
    <image>
        <name>192.168.0.20/pig4cloud/${project.artifactId}</name>
        <!-- 执行完build 自动push -->
        <publish>true</publish>
    </image>
    <docker>
        <host>http://127.0.0.1:2375</host> <!--这里配置本地的,配置服务器的务必在环境变量中添加DOCKER_HOST-->
        <tlsVerify>false</tlsVerify>
        <publishRegistry>
            <username>username</username>
            <password>password</password>
            <url>registry.cn-hangzhou.aliyuncs.com/kojima/${project.artifactId}</url><!--远程推送仓库-->
        </publishRegistry>
    </docker>
</configuration>
</plugin>

最后使用mvn spring-boot:build-image执行
这种方式需要翻墙,对于国内用户不是特别理想。可参阅使用spring-boot-maven-plugin构建docker镜像