咱們常見開源項目中使用的Docker Maven插件是com.spotify:docker-maven-plugin
。可用版本信息見Github。git
經過其介紹可知該插件已經再也不推薦使用,取而代之的是com.spotify:dockerfile-maven-plugin
,Maven中央倉庫,Github地址。github
使用該插件能夠在mvn
命令中直接構建出Docker鏡像和完成推送等。spring
dockerfile-maven-plugin
要求用戶必須提供Dockerfile用於構建鏡像,從而將Docker鏡像的構建依據統一到Dockerfile上,這與過期的docker-maven-plugin
是不一樣的。docker
該插件的開源主頁提供了豐富的參考資料:vim
使用該插件時,有一些注意事項tcp
DOCKER_HOST
選項,指向Docker Host對應端口vim /usr/lib/systemd/system/docker.service
找到ExecStart=
所在的那一行,在以後添加:ide
-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
注意
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/
構建鏡像免不了獲取基礎鏡像,須要得到指定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,是獲取基礎鏡像,上傳鏡像產品的地方。
該方法將認證信息存放在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