【轉載】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檔案中配置如下:
- <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