摘要:将基于 Maven 的 Java 项目容器化,spotify 的 dockerfile-maven 是一个不错的选择,使用简单,基本涵盖了所需功能,下面我们给出一种最佳实践的使用方法。
需要解决的问题
对于将项目容器,最需要解决什么呢?我们首先罗列一下
- Dockerfile 的编写
- 依赖文件的寻址
- image 的不同 tag 指定
- CI/CD 的自动 Docker 镜像构建和推送
第一个问题不在插件的解决范围内,但是第二个问题该插件就可以提供很好的支持,当然也就间接的为 Dockerfile 的编写提供的便利。
下面我们根据 Jhipster 默认的 Docker 配置文件介绍如何为项目加入 Dockfile 通过 Maven 构建的是方法。
文件组织
在 src/main/ 目录下加入 docker 文件夹,用于维护所有的 docker 相关的文件

pom 配置
这里有三个相关的插件:
- maven-resources-plugin
- git-commit-id-plugin
- dockerfile-maven-plugin
maven-resources-plugin
1 | <plugin> |
我们前面知道,docker 相关的文件都放置在了 src/main/docker/ 所以这个插件配置就是为了将 docker 相关文件作为 resource 放置到 target 目录下,当然这里所有 yml 文件被排除了,因为这些文件使用来运行 docker-compose 的,镜像的构建不需要这些文件。
那么为什么要放到 target 的目录呢? 因为我们最终项目的 war 包是被构建到 target 目录下,而下面我们知道, dockerfile-maven 插件可以指定构建的目录,这样只需要将项目的 target 目录设置为 contextDirectory 这时候我们 dockerfile 构建的当前目录就包含了所有必须的内容。这一点我们可以让 dockerfile 的编写更加方便,无需解决各种路径的依赖问题。
1 | FROM openjdk:8-jre-alpine |
我们可以看到在执行 ADD 命令的时候,没有任何路径,这是因为当前的路径下,已经包含了 war 和 dockerfile 本身。
git-commit-id-plugin
1 | <plugin> |
该插件是为了给 pom.xml 提供一些和 git 相关的参数,比如当前的 commit 的 id: ${git.commit.id.describe}
dockerfile-maven-plugin
1 | <plugin> |
首先 configuration 中配置 repository 的名字以及 contextDirectory,这里注意 repository 最终会成为生成的 image 的名字,如果你的 DockerHub 上有前缀,那么这里也应该有,比如 xxx/yyy,如果是私有的 docker registery, 也可以将域名也加入其中。
这里有两种方式进行构建:
- 一种是通过执行
maven的某些生命周期,从而自动完成构建。 - 手工执行
plugin的goal以及附加id构建
第一种,需要将如下代码 uncomment
1 | <!-- |
第二种:
1 | mvn dockerfile:build@version -Dsso.version=6.0.12.65 |
对于 execution 中的 configuration 的参数,我们可以自行指定,这样在 CI/CD 的过程可以动态的指定 tag