Maven 插件 docker-maven-plugin 的使用配置
Maven 插件 docker-maven-plugin 的使用配置
1. docker-maven-plugin 介绍
在持续集成过程中,项目工程一般使用 Maven 编译打包,后生成镜像,通过上传镜像,能够大大提高上线效率,同时能够快速动态扩容,快速回滚。docker-maven-plugin 插件可以帮助我们在Maven工程中,通过简单的配置,自动生成镜像并推送到仓库中。
2. 示例
2.1 配置 DOCKER_HOST
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。
2.2 构建镜像
构建镜像可以使用一下两种方式,第一种是将构建信息指定到 POM 中,第二种是使用已存在的 Dockerfile 构建。
- 第一种方式,支持将
FROM,ENTRYPOINT,CMD,MAINTAINER以及ADD信息配置在 POM 中,不需要使用Dockerfile配置 - 第二种方式,如果使用
VOLUME或其他Dockerfile中的命令的时候,需要创建一个Dockerfile,并在 POM 中配置dockerDirectory来指定路径即可。
2.2.1 指定构建信息到 pom.xml 中
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${project.artifactId}:${project.version}</imageName>
<baseImage>alpine-3.8.0-docker-image:2.0</baseImage>
<maintainer>author author@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>
2.2.2 使用 Dockerfile 构建
pom.xml 文件配置
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${project.artifactId}:${project.version}</imageName>
<!-- 指定 Dockerfile 路径-->
<dockerDirectory>${basedir}/docker</dockerDirectory>
<!-- 这里是复制 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 [author] [author@email.com]
WORKDIR /ROOT
CMD ["java", "-version"]
ENTRYPOINT ["java", "-jar", "${project.build.finalName}.jar"]
3. 绑定 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>${project.artifactId}:${project.version}</imageName>
<!-- 指定 Dockerfile 路径-->
<dockerDirectory>${basedir}/docker</dockerDirectory>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置,也可以写到 Docokerfile 中 -->
<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</goal>
</goals>
</execution>
<execution>
<id>tag-image</id>
<phase>package</phase>
<goals>
<goal>tag</goal>
</goals>
</execution>
<execution>
<id>push-image</id>
<phase>deploy</phase>
<goals>
<goal>push</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
当我们执行 mvn package 时,执行 build、tag 操作,当执行 mvn deploy 时,执行 build、tag、push 操作。如果想跳过 docker 某个过程时,只需要:
- -DskipDockerBuild 跳过 build 镜像
- -DskipDockerTag 跳过 tag 镜像
- -DskipDockerPush 跳过 push 镜像
- -DskipDocker 跳过整个阶段
例:我们想执行 package 时,跳过 tag 过程,那么就需要 mvn package -DskipDockerTag。
3.1 安全认证配置
- 在 Maven 的配置文件 setting.xml 中增加相关 server 配置,主要配置 Docker registry 用户认证信息。
<servers>
<server>
<id>docker-registry</id>
<username>author-username</username>
<password>author-password</password>
<configuration>
<email>author@mail.com</email>
</configuration>
</server>
</servers>
- 在 pom.xml 中使用 server id 配置。
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${project.artifactId}:${project.version}</imageName>
...
<serverId>docker-registry</serverId>
</configuration>
</plugin>
</plugins>
3.2 其他参数
docker-maven-plugin 插件还提供了很多很实用的配置参数
| 参数 | 说明 | 默认值 |
|---|---|---|
<forceTags>true</forceTags> |
build 时强制覆盖 tag,配合 imageTags 使用 | false |
<noCache>true</noCache> |
build 时,指定 –no-cache 不使用缓存 | false |
<pullOnBuild>true</pullOnBuild> |
build 时,指定 –pull=true 每次都重新拉取基础镜像 | false |
<pushImage>true</pushImage> |
build 完成后 push 镜像 | false |
<pushImageTag>true</pushImageTag> |
build 完成后,push 指定 tag 的镜像,配合 imageTags 使用 | false |
<retryPushCount>5</retryPushCount> |
push 镜像失败,重试次数 | 5 |
<retryPushTimeout>10</retryPushTimeout> |
push 镜像失败,重试时间 | 10s |
<rm>true</rm> |
build 时,指定 –rm=true 即 build 完成后删除中间容器 | false |
<useGitCommitId>true</useGitCommitId> |
build 时,使用最近的 git commit id 前7位作为tag,例如:image:82016a5,前提是不配置 newName | false |
[注]: Docker 镜像名称需匹配[a-z0-9-_.] 。
docker 删除容器的时候出现的 bug 解决方案
vi /etc/docker/daemon.json 的参数
"live-restore":false
/usr/lib/systemd/system/docker.service
添加了参数 MountFlags=slave
转自:https://my.oschina.net/u/3764794/blog/2995648

浙公网安备 33010602011771号