• 【转载】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

  • 相关阅读:
    KVM + LinuxBridge 的网络虚拟化解决方案实践
    netfilter/iptables 防火墙
    Linux 的路由功能
    使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移
    the quieter you become,the more you could see.
    ghost和WINHEX磁盘备份功能的区别
    快速格式化和非快速格式化
    软件是如何控制硬件的?
    如何思考一个问题?
    遇到劣质空气开关了
  • 原文地址:https://www.cnblogs.com/chaos-li/p/14179927.html
Copyright © 2020-2023  润新知