我們常見開源項目中使用的Docker Maven插件是com.spotify:docker-maven-plugin
。可用版本信息見Github。
通過其介紹可知該插件已經不再推薦使用,取而代之的是com.spotify:dockerfile-maven-plugin
,Maven中央倉庫,Github地址。
使用該插件可以在mvn
命令中直接構建出Docker鏡像和完成推送等。
dockerfile-maven-plugin
要求用戶必須提供Dockerfile用於構建鏡像,從而將Docker鏡像的構建依據統一到Dockerfile上,這與過時的docker-maven-plugin
是不同的。
該插件的開源主頁提供了豐富的參考資料:
使用該插件時,有一些注意事項
- 該插件依賴一台裝有Docker daemon的Host完成鏡像的構建
- 由於該插件需要訪問Docker Host,因此要求Docker Host打開TCP管理端口,並允許訪問
- 使用該插件的機器需要配置
DOCKER_HOST
選項,指向Docker Host對應端口 - 該插件構建和發布鏡像依賴於鏡像倉庫,需要用戶提供鏡像倉庫的登錄信息,支持POM設置和Settings設置
Docker Host開啟TCP管理端口
vim /usr/lib/systemd/system/docker.service
找到ExecStart=
所在的那一行,在之后添加:
-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
重新加載並重啟Docker,確認端口2375是否啟用:
systemctl daemon-reload
systemctl restart docker
netstat -an | grep 2375
注意
- 這種方法不使用TLS
- 還要根據Linux發行版的具體防火牆機制,開發上述管理端口供外部可靠主機訪問
客戶端配置相關參數
Windows下
set DOCKER_HOST=tcp://x.x.x.x:2375
使用TLS時,更全面的參數設置,比如:
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.0.100:2376
SET DOCKER_CERT_PATH=C:\Users\kevin\.docker\machine\machines\remote-docker-host
SET DOCKER_MACHINE_NAME=remote-docker-host
請參考:
https://www.kevinkuszyk.com/2016/11/28/connect-your-docker-client-to-a-remote-docker-host/
POM方式配置Registry認證
構建鏡像免不了獲取基礎鏡像,需要獲得指定Registry的訪問權限。
可以將登錄信息放在POM中實現認證
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${version}</version>
<configuration>
<username>repoUserName</username>
<password>repoPassword</password>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
與認證相關的是其中的username
和password
元素,
repository
是目標Docker Registry,是獲取基礎鏡像,上傳鏡像產品的地方。
Settings方式配置Registry認證
該方法將認證信息存放在Maven的Settings文件中:
<servers>
<server>
<id>docker-repo.example.com:8080</id>
<username>me</username>
<password>mypassword</password>
</server>
</servers>
然后在POM的插件配置中,如下配置:
<configuration>
<repository>docker-repo.example.com:8080/organization/image</repository>
<tag>latest</tag>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
</configuration>
注意useMavenSettingsForAuth
元素說明認證信息從Settings獲取,要求repository
對應的Registry必須在Settings中有認證配置。
命令行指定認證信息
這種方法不在POM和Settings中保存認證信息,而是在構建的mvn
命令中動態輸入Registry的用戶名和密碼 :
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${version}</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
構建命令:
mvn GOAL -Ddockerfile.username=... -Ddockerfile.password=...
插件配置
先看一個基本的使用樣例:
<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>
<dockerfile>Dockerfile</dockerfile>
<contextDirectory>${project.basedir}</contextDirectory>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
execution
指定了該插件build
和push
兩個目標使用默認綁定,默認的,build
和tag
目標綁定到package
階段,push
目標綁定到deploy
階段,這里不涉及tag
目標。tag
元素指定鏡像的tag,這里使用Maven模塊的版本號;target/${project.build.finalName}.jar
為項目構建生成的JAR包路徑- 可以使用
dockerfile
元素指定Dockerfile的位置,上例中為和POM在同級目錄;使用contextDirectory
元素指定Docker構建上下文目錄,上例中是該Maven項目的根目錄。 buildArgs
元素指定了傳遞給Dockerfile的參數,比如上例中的JAR_FILE
,相應的,Dockerfile中就可以使用該參數:
# ...
ARG JAR_FILE
COPY ${JAR_FILE} /var/app.jar
#...
注意到我們在Dockerfile中只需聲明JAR_FILE
而不用手動賦值,即可在后面的構建指令中使用。
跳過插件目標
如果要臨時跳過所有的Dockerfile相關的目標,執行如下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://blog.csdn.net/taiyangdao/article/details/79817787#commentsedit