Maven 工程打包成 Docker 镜像

2019-12-11 0 By admin

使用 Maven 服务,我们可以很方便的处理 JAVA 工程的软件包依赖和编译打包。如果我们构建的工程是运行在 Docker 容器化平台中的话,我们后面还需要将构建好的包,打到镜像中并推送到镜像仓库。第二个步骤中的制作容器镜像和推送到远程仓库的操作,我们可以编写到 Maven 服务的配置文件中,从而减少我们的手动操作,提高效率。

一、简单创建一个 spring 工程

创建了一个 dingtalk 工程,用于将 Prometheus alert 的 Webhook 警报信息转发到钉钉上去。在这一步中,工程的POM 文件中只需要配置好需要的依赖(dependencies)即可。
mvn package 命令将项目打包成jar 或者war 包。

二、编写Dockerfile

  1. FROM 指定基础镜像
  2. ENV 定义环境变量
  3. VOLUME 添加挂载目录
  4. ADD 将文件添加到镜像中
  5. WORKDIR 指定工作目录
  6. ENTRYPOINT 使用exec 模式执行镜像启动时执行的命令
  7. CMD 为 ENTRYPOINT 添加启动参数

三、创建镜像操作写入 POM 文件

  <properties>
    <java.version>1.8</java.version>
    <docker.repostory>registry-vpc.cn-shenzhen.aliyuncs.com</docker.repostory>
    <docker.registry.name>devops-lyz</docker.registry.name>
  </properties>
   <build>
   #指定资源文件
   #Directory 指定资源dockerfile 文件的路径
   #targetPath 目标文件,指定dockerfile 拷贝的目标地址和JAR 包文件生成的目录
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/docker</directory>
        <filtering>true</filtering>
        <includes>
          <include>**/Dockerfile</include>
        </includes>
        <targetPath>${project.basedir}/target/docker</targetPath>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
	  	#Maven 用于创建容器镜像使用到的插件
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>1.0.0</version>
        <configuration>
			#镜像的名称
          <imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}</imageName>
		    #镜像的目录
          <dockerDirectory>${project.basedir}/target/docker</dockerDirectory>
          <imageTags>
		  #镜像的版本信息
            <imageTag>${project.version}</imageTag>
          </imageTags>
          <resources>
            <resource>
              <targetPath>/</targetPath>
              <directory>${project.build.directory}</directory>
              <include>${project.build.finalName}.${project.packaging}</include>
            </resource>
          </resources>
        </configuration>
      </plugin>
    </plugins>
  </build>

打包命令: mvn -f pom_2_by_dockerfile.xml clean package -DskipTests docker:build

四、push 到仓库写入到 POM 文件

绑定 Docker 命令到 Maven 各个阶段,可以把 Docker 分为 build、tag、push,然后分别绑定 Maven 的 package、deploy 等阶段。这样,我们只需要执行 mvn deploy 就可以完成整个 build、tag、push 操作了。
当我们执行 mvn build 就只完成 build、tag 操作。
此外当想跳过某些步骤或者只执行某个步骤时,不需要修改 POM 文件,只需要指定跳过 docker 某个步骤即可。

      <plugin>
	  	#Maven 用于创建容器镜像使用到的插件
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>1.0.0</version>
         <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>

当我们执行 mvn package 时,执行 build、tag 操作。当执行 mvn deploy 时,执行 build、tag、push 操作。
如果想跳过 docker 某个过程时,只需要添加参数:

  1. -DskipDockerBuild 跳过 build 镜像
  2. -DskipDockerTag 跳过 tag 镜像
  3. -DskipDockerPush 跳过 push 镜像
  4. -DskipDocker 跳过整个阶段

例:我们想执行 package 时,跳过 tag 过程,那么就需要 mvn package -DskipDockerTag。