1. 程式人生 > 實用技巧 >【轉載】Dockerfile Maven外掛及擴充套件詳解

【轉載】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