【转载】Dockerfile Maven插件及扩展详解

【原文链接】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文件中配置如下:

  1.  
    <plugin>
  2.  
    <groupId>com.spotify</groupId>
  3.  
    <artifactId>dockerfile-maven-plugin</artifactId>
  4.  
    <version>${dockerfile-maven-version}</version>
  5.  
    <executions>
  6.  
    <execution>
  7.  
    <id>default</id>
  8.  
    <goals>
  9.  
    <goal>build</goal>
  10.  
    <goal>push</goal>
  11.  
    </goals>
  12.  
    </execution>
  13.  
    </executions>
  14.  
    <configuration>
  15.  
    <repository>spotify/foobar</repository>
  16.  
    <tag>${project.version}</tag>
  17.  
    <buildArgs>
  18.  
    <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
  19.  
    </buildArgs>
  20.  
    </configuration>
  21.  
    </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扩展

  1.  
    <build>
  2.  
    <extensions>
  3.  
    <extension>
  4.  
    <groupId>com.spotify</groupId>
  5.  
    <artifactId>dockerfile-maven-extension</artifactId>
  6.  
    <version>${version}</version>
  7.  
    </extension>
  8.  
    </extensions>
  9.  
    </build>

说明:其中${version}与${dockerfile-maven-version}相同,当前为1.4.0;

该扩展中支持了新类型docker-info。

2) 然后声明对hisfoobar项目的依赖

  1.  
    <dependency>
  2.  
    <groupId>com.spotify</groupId>
  3.  
    <artifactId>hisfoobar</artifactId>
  4.  
    <version>${hisfoobar-version}</version>
  5.  
    <type>docker-info</type>
  6.  
    </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文件

  1.  
    <plugin>
  2.  
    <groupId>com.spotify</groupId>
  3.  
    <artifactId>dockerfile-maven-plugin</artifactId>
  4.  
    <version>${dockerfile-maven-version}</version>
  5.  
    <configuration>
  6.  
    <repository>docker-repo.example.com:8080/organization/image</repository>
  7.  
    <tag>${project.version}</tag>
  8.  
    <buildArgs>
  9.  
    <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
  10.  
    </buildArgs>
  11.  
    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
  12.  
    </configuration>
  13.  
    </plugin>

说明:要发布的远程构件库位于docker-repo.example.com:8080/organization/image;

useMavenSettingsForAuth=true表示访问远程构件库的认证信息在settings.xml中配置。

其次,配置settings.xml文件

  1.  
    <servers>
  2.  
    <server>
  3.  
    <id>docker-repo.example.com:8080</id>
  4.  
    <username>myuser</username>
  5.  
    <password>mypassword</password>
  6.  
    </server>
  7.  
    </servers>

2) 在Docker项目的pom.xml文件中配置远程构件库的认证信息

  1.  
    <plugin>
  2.  
    <groupId>com.spotify</groupId>
  3.  
    <artifactId>dockerfile-maven-plugin</artifactId>
  4.  
    <version>${dockerfile-maven-version}</version>
  5.  
    <configuration>
  6.  
    <username>repoUserName</username>
  7.  
    <password>repoPassword</password>
  8.  
    <repository>docker-repo.example.com:8080/organization/image</repository>
  9.  
    <tag>${project.version}</tag>
  10.  
    <buildArgs>
  11.  
    <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
  12.  
    </buildArgs>
  13.  
    </configuration>
  14.  
    </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

原文地址:https://www.cnblogs.com/chaos-li/p/14179927.html