【原文链接】https://blog.csdn.net/taiyangdao/article/details/79817787
作为一个Docker项目,都绕不过Dockerfile文件构建、打标签和发布等操作。如果能够将对Dockerfile文件的这些操作包含进Maven的生命周期管理中,将极大简化Docker项目的构建发布过程。
Dockerfile Maven是Spotify公司提供的一款Maven插件(还包含一个Maven扩展),用以辅助Docker项目(借助于Maven管理)进行Dockerfile文件构建、标签和发布。Spotify公司最早还提供了另外的一款Maven插件docker-maven-plugin,但是该插件已经不再新增特性。Dockerfile Maven将取代过时的docker-maven-plugin插件。本文重点介绍的Dockerfile Maven。
Dockerfile Maven当前的最新版本1.4.0,许可证Apache License 2.0。
1. Dockerfile Maven事实上包含如下两个部分
- 一个Maven插件,其中包含3个goals
- 一个Maven扩展,支持docker-info类型的构件
2. Dockerfile Maven的特性
- 默认,构建Dockerfile的过程包含在mvn package阶段;
- 默认,为Dockerfile打标签的过程包含在mvn package阶段;
- 默认,发布Dockerfile的过程包含在mvn deploy阶段;
- 也可以直接陆续执行:
mvn dockerfile:build
mvn dockerfile:tag
mvn dockerfile:push
- 还可以支持在一个Docker项目引用另一个Docker项目的Dockerfile文件。
3. Dockerfile Maven的使用前件
- Java 7+
- Maven 3+
4. Dockerfile Maven的基本用法
在Docker项目的pom.xml文件中配置如下:
-
<plugin>
-
<groupId>com.spotify</groupId>
-
<artifactId>dockerfile-maven-plugin</artifactId>
-
<version>${dockerfile-maven-version}</version>
-
<executions>
-
<execution>
-
<id>default</id>
-
<goals>
-
<goal>build</goal>
-
<goal>push</goal>
-
</goals>
-
</execution>
-
</executions>
-
<configuration>
-
<repository>spotify/foobar</repository>
-
<tag>${project.version}</tag>
-
<buildArgs>
-
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
-
</buildArgs>
-
</configuration>
-
</plugin>
说明:其中,${dockerfile-maven-version}为Dockerfile Maven插件的版本,当前为1.4.0;
${project.version}为Docker项目的版本;
${project.build.finalName}.jar为Docker项目构建生成的组件,JAR包形式;
构建Docker项目时,直接执行mvn deploy即可构建并发布Dockerfile文件到Maven本地库spotify/foobar。
5. Dockerfile Maven扩展的用法
如果在一个Docker项目的代码开发过程中,需要访问另一个项目的Dockerfile文件信息,就需要Dockerfile Maven扩展的帮助了。
比如,当前Docker项目需要访问另一个Docker项目hisfoobar的Dockerfile文件信息,则在当前Docker项目的pom.xml文件中配置如下:
1) 首先配置Dockerfile Maven扩展
-
<build>
-
<extensions>
-
<extension>
-
<groupId>com.spotify</groupId>
-
<artifactId>dockerfile-maven-extension</artifactId>
-
<version>${version}</version>
-
</extension>
-
</extensions>
-
</build>
说明:其中${version}与${dockerfile-maven-version}相同,当前为1.4.0;
该扩展中支持了新类型docker-info。
2) 然后声明对hisfoobar项目的依赖
-
<dependency>
-
<groupId>com.spotify</groupId>
-
<artifactId>hisfoobar</artifactId>
-
<version>${hisfoobar-version}</version>
-
<type>docker-info</type>
-
</dependency>
说明:其中${hisfoobar-version}是hisfoobar项目的版本;
注意这里的foobar项目的的类型为docker-info。
3) 在代码中访问hisfoobar项目的Dockerfile文件镜像名
String imageName = getResource("META-INF/docker/com.spotify/hisfoobar/image-name");
6. Dockerfile Maven对私有Docker注册中心(如Google Container Registry)的认证支持
从1.3.0开始,在构建、发布和获取Dockerfile文件到Docker注册中心时,插件会自动检测~/.dockercfg或~/.docker/config.json等Docker配置文件。
从1.3.6开始,无需再为此配置Docker配置文件了,直接使用Maven的settings.xml或者项目的pom.xml即可。
1) 在settings.xml文件中配置远程构件库的认证信息
首先,配置Docker项目的pom.xml文件
-
<plugin>
-
<groupId>com.spotify</groupId>
-
<artifactId>dockerfile-maven-plugin</artifactId>
-
<version>${dockerfile-maven-version}</version>
-
<configuration>
-
<repository>docker-repo.example.com:8080/organization/image</repository>
-
<tag>${project.version}</tag>
-
<buildArgs>
-
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
-
</buildArgs>
-
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
-
</configuration>
-
</plugin>
说明:要发布的远程构件库位于docker-repo.example.com:8080/organization/image;
useMavenSettingsForAuth=true表示访问远程构件库的认证信息在settings.xml中配置。
其次,配置settings.xml文件
-
<servers>
-
<server>
-
<id>docker-repo.example.com:8080</id>
-
<username>myuser</username>
-
<password>mypassword</password>
-
</server>
-
</servers>
2) 在Docker项目的pom.xml文件中配置远程构件库的认证信息
-
<plugin>
-
<groupId>com.spotify</groupId>
-
<artifactId>dockerfile-maven-plugin</artifactId>
-
<version>${dockerfile-maven-version}</version>
-
<configuration>
-
<username>repoUserName</username>
-
<password>repoPassword</password>
-
<repository>docker-repo.example.com:8080/organization/image</repository>
-
<tag>${project.version}</tag>
-
<buildArgs>
-
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
-
</buildArgs>
-
</configuration>
-
</plugin>
对比可以发现,访问远程构件库的认证信息直接在pom.xml中配置了。
7. Docker项目中配置了Dockerfile Maven插件,但是在Maven的构建过程中想临时跳过Dockerfile相关的构建、发布
如果要临时跳过所有的Dockerfile相关的所有3个goals,执行如下Maven命令:
mvn clean install -Ddockerfile.skip
如果只是想跳过某一个goal,执行如下Maven命令:
mvn clean package -Ddockerfile.build.skip
mvn clean package -Ddockerfile.tag.skip
mvn clean deploy -Ddockerfile.push.skip
参考链接:
https://github.com/spotify/dockerfile-maven
https://github.com/spotify/docker-maven-plugin