目前,我們不會開發或接受新功能,甚至不會修復非關鍵錯誤。
這個 Maven 插件將 Maven 與 Docker 整合。
設計目標是:
Dockerfile
是建置 Docker 專案的方式;這就是這個插件的用途。它們是強制性的。mvn package
時,您將獲得一個 Docker 映像。當您輸入mvn deploy
時,您的映像將會被推送。mvn dockerfile:build
以及稍後的mvn dockerfile:tag
和稍後的mvn dockerfile:push
沒有問題。這也消除了對mvn dockerfile:build -DalsoPush
之類的需求;相反,你可以只說mvn dockerfile:build dockerfile:push
。該項目遵守開放行為準則。透過參與,您應該遵守此準則。
請參閱變更日誌以取得版本列表
該外掛程式需要 Java 7 或更高版本以及 Apache Maven 3 或更高版本(dockerfile-maven-plugin <=1.4.6 需要 Maven >= 3,對於其他情況,Maven >= 3.5.2)。要運行整合測試或在實踐中使用該插件,需要有效的 Docker 設定。
有關更多範例,請參閱整合測試目錄。
特別是,高級測試展示了由兩個使用helios-testing
進行整合測試的微服務組成的完整服務。
這將配置實際的插件以使用mvn package
建立映像並使用mvn deploy
推送它。當然你也可以明確地說mvn dockerfile:build
。
< 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
可能如下所示:
FROM openjdk:8-jre
MAINTAINER David Flemström <[email protected]>
ENTRYPOINT ["/usr/bin/java", "-jar", "/usr/share/myservice/myservice.jar"]
# Add Maven dependencies (not shaded into the artifact; Docker-cached)
ADD target/lib /usr/share/myservice/lib
# Add the service itself
ARG JAR_FILE
ADD target/${JAR_FILE} /usr/share/myservice/myservice.jar
重要提示
引用建置工件的最 Maven 風格的方法可能是使用project.build.directory
變數來引用「目標」目錄。但是,這會產生絕對路徑,而 Dockerfile 中的 ADD 命令不支援該絕對路徑。任何此類來源都必須位於 Docker 建置的上下文內,因此必須透過相對路徑引用。參見#101
不要使用${project.build.directory}
作為引用建立目錄的方式。
在您的構建中使用此插件有很多優點。
該外掛程式可讓您更一致地利用 Docker 緩存,透過在映像中快取 Maven 依賴項來大幅加快建置速度。它還鼓勵避免使用maven-shade-plugin
,這也大大加快了建置速度。
你不再需要說這樣的話:
mvn package
mvn dockerfile:build
mvn verify
mvn dockerfile:push
mvn deploy
相反,只需說:
mvn deploy
透過基本配置,這將確保在正確的時間建置和推送映像。
您可以依賴另一個專案的 Docker 訊息,因為該插件在建立 Docker 映像時會附加專案元資料。只需將此資訊添加到任何項目中即可:
< dependency >
< groupId >com.spotify</ groupId >
< artifactId >foobar</ artifactId >
< version >1.0-SNAPSHOT</ version >
< type >docker-info</ type >
</ dependency >
現在,您可以閱讀有關您所依賴的項目的 Docker 映像的資訊:
String imageName = getResource ( "META-INF/docker/com.spotify/foobar/image-name" );
這對於您想要另一個專案的 Docker 映像的最新版本的整合測試來說非常有用。
請注意,您必須在 POM(或父親 POM)中註冊 Maven 擴充功能才能支援docker-info
類型:
< build >
< extensions >
< extension >
< groupId >com.spotify</ groupId >
< artifactId >dockerfile-maven-extension</ artifactId >
< version >${version}</ version >
</ extension >
</ extensions >
</ build >
您的項目如下所示:
a/
Dockerfile
pom.xml
b/
Dockerfile
pom.xml
現在您可以將這些項目與 Fig 或 docker-compose 或其他與 Dockerfiles 配合使用的系統一起使用。例如, docker-compose.yml
可能如下所示:
service-a :
build : a/
ports :
- ' 80 '
service-b :
build : b/
links :
- service-a
現在, docker-compose up
和docker-compose build
將按預期工作。
請參閱使用文件。
請參閱身份驗證文件。
要削減 Maven 版本:
mvn clean [-B -Dinvoker.skip -DskipTests -Darguments='-Dinvoker.skip -DskipTests']
-Dgpg.keyname=<key ID used for signing artifacts>
release:clean release:prepare release:perform
我們使用gren
在 Github 中建立 Release:
gren release