摘要介绍
在较早的项目中基于maven插件构建 SpringBoot 项目的Docker镜像时,使用的是Spotify推出docker-maven-plugin,但是现在Spotify官方已经不再推荐使用该插件,转而推荐使用最新推出的dockerfile-maven-plugin,根据官网介绍主要原因为:与docker-maven插件相比dockerfile-maven-plugin具有更少的抽象和配置,并且构建更为简单,故本文介绍基于dockerfile-maven-plugin进行 SpringBoot 项目的镜像构建和仓库推送;
环境准备
在使用dockerfile-maven-plugin进行镜像构建之前需要完成如下环境准备:
- 在本机安装对应版本的Docker并配置镜像加速,参考文章:CentOS8安装Docker&配置Aliyun镜像加速;
- 在第一步的基础上拉取项目镜像构建所需要的基础镜像如:openjdk,否则可能出现构建镜像超时的情况;
- 在项目的根目录下(与pom.xml同级)编写DokcerFile(内容参考如下:);
# 继承的基础镜像
FROM openjdk:8-jdk-alpine
# 将本地文件夹挂在到当前容器
VOLUME /tmp
ARG JAR_FILE
# 复制文件到容器
ADD target/${JAR_FILE} app.jar
# 声明需要暴露的端口
EXPOSE 8081
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Docker镜像构建&推送
1.配置pom.xml的dockerfile-maven-plugin
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
相关配置说明:
- tag:即为镜像被构建后的tag;
- buildArgs:构建参数,通过buildArgs指定的变量,可在Dockerfile中通过ARG指令引用进来,然后就可以在Dockerfile的其他地方用${variable_name}的方式引用由pom.xml传递进来的变量值;
2.配置dockerfile-maven-plugin的访问认证
接下来,需要为插件配置认证信息,即登录Docker Hub的用户名和密码。因为插件在push镜像前,需要登录Docker Hub,主要有三种认证配置方式: - 第一种:在pom.xml的docker构建插件中的<configuration>里新增<username>和<password>配置;
<configuration>
<tag>${project.version}</tag>
<username>kevinchen19888</username>
<password>xxxx</password>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
- 第二种:在settings.xml中配置server 如下所示,在maven的settings.xml中的servers下增加一个server配置:
<servers>
<server>
<id>docker.io</id>
<username>kevinchen19888</username>
<password>xxxx</password>
</server>
</servers>
对于Docker Hub,server.id必须是:docler.io,然后在pom.xml中指定useMavenSettingsForAuth为true:
<configuration>
<tag>${project.version}</tag>
<!--新增useMavenSettingsForAuth配置-->
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
- 第三种:直接在mvn命令行上提供认证信息
如果没有在pom.xml中配置认证信息,也没有在settings.xml中配置认证信息,那么我们还可以简单地在运行的mvn命令行上以参数的形式提供认证信息,如下所示:
mvn dockerfile:push -Ddockerfile.username=kevinchen19888 -Ddockerfile.password=xxxx第一种方式,由于需要在pom.xml中配置用户密码,而pom.xml一般都会随着源码一起提交到版本控制系统中,因此有暴露用户密码的风险。 第三种方式,在每次运行maven命令时,都需要额外提供用户名和密码,比较麻烦;
因此,一般推荐使用第二种方式;
然后在构建镜像之前需要在pom.xml中为该插件先配置正确的Docker镜像的repository名字,如下:注意,以上'Docker仓库名称'的格式必须为:<configuration> <!--配置Docker仓库名称以便push镜像--> <repository>kevinchen19888/docker-demo</repository> <tag>${project.version}</tag> <useMavenSettingsForAuth>true</useMavenSettingsForAuth> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration><username>/<repository_name>,用户名即为镜像中心(Docker Hub)中注册的用户名,repository_name就是上一步在Docker Hub上创建的repository名字;
3.构建Docker镜像
可以通过运行maven命令来构建Docker镜像:mvn package或者通过docker插件命令mvn dockerfile:build,再或者直接通过Idea中的clean和package命令进行项目的打包构建,如下图
命令执行成功后,运行docker命令检查镜像是否存在:
docker images
如果存在则说明构建成功;
4.推送Docker镜像
Docker镜像构建好后,我们还可以使用该插件将镜像推送到Docker仓库,如Docker Hub。
-
创建repository
首先需要登录Docker Hub并创建一个repository,如下图所示,创建了一个docker-demo的repository: -
push镜像
通过如下命令进行镜像推送
mvn dockerfile:push
注意,如果你没有配置部署artifact的maven repository,请不要使用mvn deploy命令,因为它会执行maven-deploy-plugin的deploy目标,而由于没有配置要部署的远程maven repository,会报类似如下的错:Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter
-
maven命令执行成功后,可以登录Docker Hub来检查镜像是否存在
至此Docker打包 SpringBoot 项目并推送到Docker Hub实现完成!