使用 dockerfile-maven-plugin 构建 docker 镜像

简介

本文介绍了 com.spotify:dockerfile-maven-plugin 的简单使用示例。
最终达成的目标是把 docker 镜像构建集成在 maven 打包过程中,可以使用 maven 命令构建 docker 镜像。

功能相似的插件有三个:

  • com.spotify:dockerfile-maven-plugin
    本文使用的插件,已经停止更新,但功能依旧稳定。
  • com.spotify:docker-maven-plugin
    本文所用插件的同胞兄弟,官方不推荐使用,已停止更新。
  • io.fabric8io:docker-maven-plugin
    支持在 pom.xml 中配置 Dockerfile 的各项内容,也支持自定义 Dockerfile,支持操作容器,功能强大,仍在更新。

使用

以 spring-boot-web 项目为例:

  1. 创建一个 spring-boot-web 项目并确保项目正常;
  2. 依据项目需要在合适的位置定制一个 Dockerfile,这里把 Dockerfile 放在了 src/main/docker 目录下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM openjdk:8-jdk-alpine
# 设置时区
ENV TZ Asia/Shanghai
RUN apk --no-cache add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \
&& apk del tzdata

VOLUME /tmp
# 定义变量
ARG JAR_FILE
ADD target/${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
# 声明服务以 tcp 协议运行在 8080 端口
EXPOSE 8080/tcp
  1. project 标签下添加插件配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<build>
<plugins>
<!--dockerfile-maven-plugin 配置-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>build</id>
<!--绑定 maven 阶段-->
<!--install 表示运行 mvn install 时会自动执行 docker 镜像构建-->
<!--install 也可以改成 package,运行 mvn package 时会自动执行 docker 镜像构建-->
<phase>install</phase>
<goals>
<!--执行插件的目标-->
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定 docker 镜像仓库-->
<repository>cn/diqigan/${project.artifactId}</repository>
<!--指定 docker 镜像标签-->
<tag>${project.version}</tag>
<!--指定 Dockerfile 路径-->
<dockerfile>src/main/docker/Dockerfile</dockerfile>
<!--设置 Dockerfile 中变量-->
<buildArgs>
<!--对应 Dockerfile 中的 JAR_FILE 变量-->
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
<!--dockerfile-maven-plugin 配置-->
</plugins>
</build>
  1. 构建镜像

镜像构建有两种方式:

  • 绑定 maven 阶段自动构建:

    以文中所示配置,执行 mvn install 指令会自动构建 docker 镜像。

  • 显式运行构建指令 mvn package dockerfile:buld 构建 docker 镜像。

可以在 maven 控制台日志中看到 docker 镜像已经构建成功。

dockerfile-maven-plugin-build-log

  1. 跳过镜像构建

如果前面在 pom.xml 插件配置中绑定了在 maven 阶段自动构建 docker 镜像,但是某次打包过程中又不希望自动构建 docker 镜像,可以通过 dockerfile.skip 参数跳过 docker 镜像构建。

1
mvn clean install -Ddockerfile.skip

后记

  1. 个人不推荐在 pom.xml 中配置 Dockerfile 的各项内容,有种配置侵入的感觉,建议另写一个 Dockerfile 文件;
  2. 持续集成过程中完全可以使用 docker 相关指令构建镜像,maven 插件有点画蛇添足的意思;
  3. 本文相关代码可在 Seven-Steven/spring-examples 查看;

参考文档

  • 官方使用文档
  • 官方使用示例