镜像构建方式
docker-maven-plugin插件构建docker镜像有两种方式:
1. 指定参数,由docker-maven-plugin插件根据这些参数来制作镜像;
2. 指定Dockerfile,这和我们用docker build命令来构建镜像的过程一样,不过docker-maven-plugin帮我们把工程构建和镜像构建两件事串起来了;
接下来我们将上述两种方式都实践一下;
第一种构建方式:通过参数构建
在mavendockerplugindemo工程目录下新建文件pom_1_by_param.xml,内容和pom.xml一样,然后我们再去<plugins>节点添加以下内容,放在原有的<plugin>节点后面,如下所示:
<plugins> <!--这是原有的spring boot插件--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!--新增的docker maven插件--> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.12</version> <!--docker镜像相关的配置信息--> <configuration> <!--镜像名,这里用工程名--> <imageName>${project.artifactId}</imageName> <!--TAG,这里用工程版本号--> <imageTags> <imageTag>${project.version}</imageTag> </imageTags> <!--镜像的FROM,使用java官方镜像--> <baseImage>java:8u111-jdk</baseImage> <!--该镜像的容器启动后,直接运行spring boot工程--> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <!--构建镜像的配置信息--> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins>
上面的每个参数都已加了注释,就不多说了,在此文件所在目录执行以下命令,指定pom_1_by_param.xml作为pom文件执行maven构建:
mvn clean package docker:build
执行成功后输出以下信息:
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ mavendockerplugindemo --- [INFO] Building jar: /usr/local/work/mavendockerplugindemo/target/mavendockerplugindemo-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- spring-boot-maven-plugin:1.5.9.RELEASE:repackage (default) @ mavendockerplugindemo --- [INFO] [INFO] --- docker-maven-plugin:0.4.12:build (default-cli) @ mavendockerplugindemo --- [INFO] Copying /usr/local/work/mavendockerplugindemo/target/mavendockerplugindemo-0.0.1-SNAPSHOT.jar -> /usr/local/work/mavendockerplugindemo/target/docker/mavendockerplugindemo-0.0.1-SNAPSHOT.jar [INFO] Building image mavendockerplugindemo Step 1/3 : FROM java:8u111-jdk ---> d23bdf5b1b1b Step 2/3 : ADD /mavendockerplugindemo-0.0.1-SNAPSHOT.jar // ---> 74f201b46c92 Removing intermediate container cbc9e456d139 Step 3/3 : ENTRYPOINT java -jar /mavendockerplugindemo-0.0.1-SNAPSHOT.jar ---> Running in 256a09be033d ---> ad342e51021e Removing intermediate container 256a09be033d Successfully built ad342e51021e [INFO] Built mavendockerplugindemo [INFO] Tagging mavendockerplugindemo with 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 11.617 s [INFO] Finished at: 2017-12-23T00:00:06-08:00 [INFO] Final Memory: 35M/84M [INFO] ------------------------------------------------------------------------
执行docker images命令可以看到如下信息,新的镜像已经创建好了:
root@instance-282sg05l:/kitking/app/girl# docker images REPOSITORY TAG IMAGE ID CREATED SIZE girl 0.0.1-SNAPSHOT e6d299ed7821 13 minutes ago 660MB girl latest e6d299ed7821 13 minutes ago 660MB delron/fastdfs latest 8487e86fc6ee 7 months ago 464MB java 8u111-jdk d23bdf5b1b1b 22 months ago 643MB
验证第一种方式构建的镜像
执行以下命令,使用刚刚构建的镜像创建一个容器:
docker run --name kitking -p 8081:8081 girl
第二种构建方式:指定Dockerfile
这种方式要我们自己写Dockerfile,好处是可以按照自己的需要在Dockerfile中添加更多内容,而不像第一种方式那样只能按照插件的参数规则来配置;
<!--新增的docker maven插件--> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.12</version> <!--docker镜像相关的配置信息--> <configuration> <!--镜像名,这里用工程名--> <imageName>${project.artifactId}</imageName> <!--Dockerfile文件所在目录-->
<dockerDirectory>${project.basedir}/docker/Dockerfile</dockerDirectory> <!--TAG,这里用工程版本号--> <imageTags> <imageTag>${project.version}</imageTag> </imageTags> <!--构建镜像的配置信息--> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
在工程的src/main/docker/目录下新建Dockerfile文件,如下图:
Dockerfile的内容如下,就是将工程构建完毕后的jar包复制到home目录,然后构建镜像:
ENV ARTIFACTID mavendockerplugindemo ENV ARTIFACTVERSION 0.0.2-SNAPSHOT ENV HOME_PATH /home ADD /$ARTIFACTID-$ARTIFACTVERSION.jar $HOME_PATH/mavendockerplugindemo.jar WORKDIR $HOME_PATH ENTRYPOINT ["java","-jar","mavendockerplugindemo.jar"]
可以开始构建了:
mvn clean package docker:build