一、docker-maven-plugin 介紹java
在咱們持續集成過程當中,項目工程通常使用 Maven 編譯打包,而後生成鏡像,經過鏡像上線,可以大大提供上線效率,同時可以快速動態擴容,快速回滾,着實很方便。docker-maven-plugin 插件就是爲了幫助咱們在Maven工程中,經過簡單的配置,自動生成鏡像並推送到倉庫中。nginx
二、環境、軟件準備git
本次演示環境,我是在本機 Mac OX 上操做,如下是安裝的軟件及版本:github
- Docker:version 17.03.1-ce
- Maven:version 3.3.9
- Java: version 1.8.0_91
- docker-maven-plugin:1.0.0
注意:這裏咱們要測試 Java Maven 項目用 docker-maven 插件打鏡像,上傳鏡像等操做,因此須要先安裝一下 Docker、Maven、Java,這裏忽略安裝過程。sql
三、Demo 示例docker
3.1 配置 DOCKER_HOSTapache
docker-maven-plugin 插件默認鏈接本地 Docker 地址爲:localhost:2375,因此咱們須要先設置下環境變量。緩存
DOCKER_HOST=tcp://<host>:2375
注意:若是沒有設置 DOCKER_HOST
環境變量,能夠命令行顯示指定 DOCKER_HOST
來執行,如我本機指定 DOCKER_HOST:DOCKER_HOST=unix:///var/run/docker.sock mvn clean install docker:build
。安全
3.2 示例構建鏡像markdown
構建鏡像可使用一下兩種方式,第一種是將構建信息指定到 POM 中,第二種是使用已存在的 Dockerfile 構建。
第一種方式,支持將 FROM
, ENTRYPOINT
, CMD
, MAINTAINER
以及 ADD
信息配置在 POM 中,不須要使用 Dockerfile 配置。可是若是使用 VOLUME
或其餘 Dockerfile 中的命令的時候,須要使用第二種方式,建立一個 Dockerfile,並在 POM 中配置 dockerDirectory
來指定路徑便可。
這裏咱們以一個 Java Maven 項目 mavendemo 做爲示例演示一下。
3.2.1 指定構建信息到 POM 中構建
<build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>mavendemo</imageName> <baseImage>java</baseImage> <maintainer>docker_maven docker_maven@email.com</maintainer> <workdir>/ROOT</workdir> <cmd>["java", "-version"]</cmd> <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint> <!-- 這裏是複製 jar 包到 docker 容器指定目錄配置 --> <resources> <resource> <targetPath>/ROOT</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build>
3.2.2 使用 Dockerfile 構建
pom.xml配置
<build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>mavendemo</imageName> <dockerDirectory>${basedir}/docker</dockerDirectory> <!-- 指定 Dockerfile 路徑--> <!-- 這裏是複製 jar 包到 docker 容器指定目錄配置,也能夠寫到 Docokerfile 中 --> <resources> <resource> <targetPath>/ROOT</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build> ${basedir}/docker/Dockerfile 配置 FROM java MAINTAINER docker_maven docker_maven@email.com WORKDIR /ROOT CMD ["java", "-version"] ENTRYPOINT ["java", "-jar", "${project.build.finalName}.jar"]
以上兩種方式執行docker:build
效果是同樣的,執行輸出過程大體以下:
[INFO] --- docker-maven-plugin:1.0.0:build (default-cli) @ mavenDemo --- [INFO] Building image mavendemo Step 1/5 : FROM java ---> d23bdf5b1b1b Step 2/5 : MAINTAINER docker_maven docker_maven@email.com ---> Using cache ---> 2faf180d4a50 Step 3/5 : WORKDIR /ROOT ---> Using cache ---> 862210f7956a Step 4/5 : ENTRYPOINT java -jar mavenDemo.jar ---> Running in 96bbe83de6ec ---> c29009c88993 Removing intermediate container 96bbe83de6ec Step 5/5 : CMD java -version ---> Running in f69b8d2a75b1 ---> bc8d54014325 Removing intermediate container f69b8d2a75b1 Successfully built bc8d54014325
執行完成後,使用docker images
查看生成的鏡像:
REPOSITORY TAG IMAGE ID CREATED SIZE mavendemo latest 333b429536b2 38 minutes ago 643 MB
3.3 執行命令
mvn clean package docker:build
只執行 build 操做
mvn clean package docker:build -DpushImage
執行 build 完成後 push 鏡像
mvn clean package docker:build -DpushImageTag
執行 build 並 push 指定 tag 的鏡像
注意:這裏必須指定至少一個 imageTag,它能夠配置到 POM 中,也能夠在命令行指定。命令行指定以下:mvn clean package docker:build -DpushImageTags -DdockerImageTags=imageTag_1 -DdockerImageTags=imageTag_2
,POM 文件中指定配置以下:
<build>
<plugins>
... <plugin> <configuration> ... <imageTags> <imageTag>imageTag_1</imageTag> <imageTag>imageTag_2</imageTag> </imageTags> </configuration> </plugin> ... </plugins> </build>
3.4 綁定Docker 命令到 Maven 各個階段
咱們能夠綁定 Docker 命令到 Maven 各個階段,咱們能夠把 Docker 分爲 build、tag、push,而後分別綁定 Maven 的 package、deploy 階段,此時,咱們只須要執行mvn deploy
就能夠完成整個 build、tag、push操做了,當咱們執行mvn build
就只完成 build、tag 操做。除此此外,當咱們想跳過某些步驟或者只執行某個步驟時,不須要修改 POM 文件,只須要指定跳過 docker 某個步驟便可。好比當咱們工程已經配置好了自動化模板了,可是此次咱們只須要打鏡像到本地自測,不想執行 push 階段,那麼此時執行要指定參數-DskipDockerPush
就可跳過 push 操做了。
<build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>mavendemo</imageName> <baseImage>java</baseImage> <maintainer>docker_maven docker_maven@email.com</maintainer> <workdir>/ROOT</workdir> <cmd>["java", "-version"]</cmd> <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/ROOT</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build