文档首页 > > 最佳实践> 使用Maven构建包制作Docker镜像

使用Maven构建包制作Docker镜像

分享
更新时间: 2019/09/26 GMT+08:00

背景

为方便使用,DevCloud编译构建服务提供了大量构建步骤、模板等,并通过缓存、私有依赖库、开源镜像站等实现开箱即用编译构建体验;但由于构建场景多样化,初次使用编译构建服务时,仍有可能会因设计不当或理解偏差、使用方式不当,导致上手过程存在一定困难。因此此,编译构建针对常见的复杂构建场景提供完整的最佳实践方案,供初次使用DevCloud编译构建服务或需要尝试复杂构建场景的用户使用。

目标

本文旨在演示如何使用DevCloud编译构建服务完成Maven构建,使用构建包制作Docker镜像并推送到SWR仓库,同时对构建过程涉及的开源镜像站、私有依赖库、缓存的使用等作简要说明。

SWR,即华为云容器镜像服务。SWR镜像仓库用于存储用户上传的Docker镜像,可以在构建、部署时或其他场景使用。

项目说明

本文演示项目涉及两个Maven工程、一个基础Docker镜像及一个Dockerfile。

  • WebServer项目:此次构建主项目,期望使用DevCloud构建此项目,并使用得到的构建包制作Docker镜像,制作镜像所用Dockerfile存放于此项目根目录。
  • WebUtil项目:WebServer依赖的自研工具包,在WebServer项目pom文件中引入,主要为演示私有依赖库使用场景。
  • 基础镜像:以此镜像为基础,在基础镜像中添加WebServer构建包制作Docker镜像。
  • Dockerfile:用来制作镜像。

项目构建过程如下:

本文详细描述了从准备代码仓库到构建并制作镜像、推送镜像到SWR仓库的完整过程。大致分为以下步骤,可根据熟悉程度选择阅读:

构建准备

如果是初次使用DevCloud,请确认已完成准备操作,然后开始本示例。

  1. 准备WebUtil项目代码仓库

    进入代码托管服务,新建空白仓库WebUtil,并将WebUtil项目代码提交到此仓库。

      

  2. 准备WebServer项目代码

    1. 新建空白仓库WebServer,并将WebServer项目代码提交到此仓库。
    2. 编写Dockerfile。
      • 准备基础镜像,可使用DockerHub或SWR仓库中公开镜像,本例中使用CentOS作为基础镜像。
      • 获取构建包路径。

        Maven构建包名格式为artifactId-version.packaging,构建包默认生成于“./target”目录下。

        查看WebServer项目pom.xml中坐标定义。若坐标如下图所示,则最终构建包路径为:./target/server-1.0.jar。

          

    3. 使用获取的构建包路径编写Dockerfile。
      FROM centos 
      MAINTAINER <devcloud@demo.com> 
      USER root 
      RUN mkdir /demo 
      COPY ./target/server-1.0.jar /demo/app.jar
    4. 上传Dockerfile到WebServer项目根目录。

        

  3. 准备SWR镜像仓库

    前往华为云容器镜像服务,请参考容器镜像服务用户指南准备SWR仓库。

  4. 创建组织

    在DevCloud编译构建服务添加步骤“制作镜像并推送到SWR仓库”步骤时,需要指定SWR组织名,参考创建组织

      

上传/发布私有依赖

本节说明如何将所需私有依赖上传/发布到私有私有依赖库,使用DevCloud构建前请务必仔细阅读以下注意事项,以避免因依赖使用不当导致后续的构建异常

私有依赖库软件发布库属于两个概念,要注意区分:

  1. 软件发布库主要用于归档用以部署或其他用途的软件包。
  2. 私有依赖库主要用于存储供其他项目使用的工具包等,如WebUtil.jar。
  3. 使用时要务必注意区分,避免出现如“将依赖上传到软件发布库但是构建时无法下载”此类场景。

此例中假设WebServer使用了三种私有依赖:

  • WebUtil:项目组自研公共组件,此时使用构建任务发布私有依赖。
  • CommonUtil:合作伙伴提供,有jar包,有pom文件(CommonUtil项目pom文件,不可使用WebServer项目的),此时可使用POM模式手工上传。
  • MessageSDK:三方消息推送平台提供,只有Jar包,无POM文件,此时需要考虑可否通过其他途径获取POM文件,或者能否直接使用GAV模式上传。

  

  1. 初始化私有依赖库

    新用户首次使用软件开发云服务时,需要前往私有依赖库首页初始化私有依赖库,详情可参考文档创建私有依赖库

      

  2. 发布自研工具包WebUtil

    对于自行研发的工具包(需要以一定频率编译发布依赖包),推荐使用DevCloud编译构建服务提供的“发布Maven私有包”功能构建并发布私有包到私有依赖库。强烈建议尽可能使用此方式发布依赖,此方式具备以下优势:
    • 工具包版本迭代时,可以一键发布,避免版本迭代带来的重复的手工上传依赖动作。
    • 可结合构建任务、流水线的定时构建、合并代码触发等功能实现自动化持续集成。
    • 使用构建任务发布的内容由maven自动生成,可有效避免人为造成的文件缺失、损坏,保证上传依赖的完整性、有效性。

    任务配置步骤如下:

    1. 新建构建任务,任务名称为“发布WebUtil到私有依赖库”

      源码源选择“DevCloud”,源码仓库选择“WebUtil”

      构建模板选择“发布maven私有包”

        

      模板“发布maven私有包”预置了步骤“配置maven私有仓库”“Maven构建”,以及默认的mvn deploy命令。多数场景下,直接使用即可完成构建并将生成的依赖包发布到DevCloud私有依赖仓库。

        

    2. 配置步骤“配置maven私有仓库”:此步骤无需任何参数,在步骤中添加即可直接使用。
      说明:

      步骤“配置maven私有仓库”作用是为“发布maven私有包(mvn deploy)”命令指定私有仓库地址,如构建过程只需要从私有依赖库下载依赖,无需添加此步骤。

    3. 配置步骤“Maven构建”

      检查构建命令:模板“发布maven私有包”已给出默认参数配置,此处只需确认参数正确即可。

      • 默认命令要从根目录读取pom文件,本例中WebUtil项目pom文件在根目录,无需调整。
      • WebUtil项目要求使用jdk1.8编译、运行,确认工具版本选择maven-3.5.3-jdk1.8无误。
      • 本次构建目标为发布私有包,默认命令为mvn deploy,无需调整。
        说明:

        mvn deploy命令作用为将项目打包,并发布到指定的依赖仓库;可供其他项目直接引用。

        必要时(无需发布到私有仓库或私有仓库故障)也可选择使用mvn install,将项目打包并install到构建缓存,同样可以供其他项目直接引用(构建时需要使用缓存,缓存内容不保证数据持久性,如丢失需重新构建)

        默认命令参数说明可参考Maven构建默命令含义

      检查缓存配置

      • DevCloud编译构建服务提供了构建缓存加速功能,可通过缓存配置选择是否使用缓存。
      • 由于网络抖动、并发构建或其他极端情况,可能出现缓存内容异常导致构建异常,此时需要参考缓存清理步骤清理缓存。
    4. 保存任务,执行成功后可于私有依赖库查看上传的依赖。

        

  3. 使用POM模式手工上传依赖包CommonUtil

    部分情况下,项目中使用的依赖是以SystemPath方式引入,或者拿到三方提供的jar包手工上传到企业自建的私有依赖库中(如本例中CommonUtil包),该类依赖无法从公开仓库下载,且不适合使用DevCloud构建任务发布;此时需要在私有依赖库手工上传,上传时优先使用POM模式,步骤如下:

    1. 进入私有依赖库首页,根据要上传的依赖包类型选择仓库类型。
    2. 获取POM文件。
      • 方式一:从原始仓库下载pom

        部分依赖可能来自于DevCloud无法访问的三方仓库,用户自己可以从仓库下载,此类场景下Maven仓库一般会同时提供jar包和pom文件,用户直接从原仓库下载POM文件即可。

          

      • 方式二:从jar包中获取pom文件

        因为各种原因,部分依赖可能只能找到jar包,原始仓库、源码、pom文件等都无法找到,此时可以参考以下步骤尝试获取POM文件(以WebUtil包为例):

        1. 解压util-1.0.0.jar,如无法解压先更改后缀为支持的压缩包格式。
        2. 进入解压所得目录,打开“META-INF/maven/{groupid}/{artifactid}/目录”,此处为“META-INF/maven/com.huawei.demo.web/util”,打开该pom文件,确认无误则可直接使用。
        3. 如果确认无法找到POM文件,则需要考虑是否可以使用GAV模式上传
    3. 单击“上传”按钮,选择“POM模式”,选择POM文件和jar文件上传即可。

      以WebUtil为例,手工上传需要注意:

      此处是WebServer项目依赖WebUtil项目,上传WebUtil项目时,必须使用WebUtil项目的pom文件,如果误操作上传了WebServer项目的POM文件与WebUtil项目jar包,会导致上传依赖坐标与预期不一致,导致依赖下载失败。

        

  4. 使用GAV模式上传三方依赖MessageSDK

    优先考虑了使用POM模式手工上传依赖后,若始终无法找到POM文件,则需要考虑使用GAV模式上传;但此方式存在一定隐患,使用前需要注意评估。

    可以使用GAV模式的场景及风险说明:

    1. 使用GAV模式上传时,私有仓库会根据输入的坐标信息自动生成POM文件,文件内容只包含依赖自身坐标定义。
    2. 以WebUtil为例,如果WebUtil项目本身依赖了工具包lib.jar,使用GAV模式上传WebUtil后,会导致最终WebServer构建无法下载lib.jar,导致构建包与预期不符。
    3. 反之,若WebUtil项目本身无任何依赖(pom文件的节点为空),则可以使用此模式上传。

    如您已认真阅读以上风险说明,确保上传依赖无上述隐患或接受该风险,可按如下步骤操作:

    1. 进入私有依赖库首页,根据要上传的依赖包类型选择仓库类型。
    2. 单击上传,选择“GAV模式”,根据提示编辑坐标信息,选择jar文件,上传即可。

        

打包并制作、推送镜像

  1. 新建构建任务“使用WebServer制作Docker镜像”

    源码源选择“DevCloud”,源码仓库选择“WebServer”

    构建模板选择“Maven”

      

    模板“Maven”预置了步骤“Maven构建”“上传软件包到软件发布库”,以及配套的默认构建命令。多数场景下,直接使用即可完成构建并将生成的软件包上传到软件发布库,本例需要删除“上传软件包到软件发布库”步骤。

  2. 删除步骤“上传软件包到软件发布库”

    如需要归档软件包到发布库,可选择保留,构建包路径与准备WebServer项目代码中描述的一致,一般已自动生成。

  3. 配置步骤“Maven构建”,确认构建命令、缓存配置无误。

    检查构建命令:模板“Maven”已给出默认参数配置,此处只需确认参数正确即可。

    • 默认命令要从根目录读取pom文件,本例中WebServer项目pom文件在根目录,无需调整。
    • WebServer项目要求使用jdk1.8编译、运行,确认工具版本选择maven-3.5.3-jdk1.8无误。
    • 本次构建目标为打包,默认命令为mvn package,无需调整;默认参数说明可参考Maven构建默认命令含义

    检查缓存配置

    • DevCloud编译构建服务提供了构建缓存加速功能,用户可通过缓存配置选择是否使用缓存。
    • 由于网络抖动、并发构建或其他极端情况,可能出现缓存内容异常导致构建异常,此时需要参考缓存清理步骤清理缓存。

  4. 在步骤“Maven构建”之前添加步骤“配置Maven华为开源镜像站”

    DevCloud编译构建任务会自动配置私有依赖库和华为开源镜像站,华为开源镜像站已代理或同步的镜像源有:

    换言之,如果您使用的依赖皆可在以上仓库和私有依赖库找到,在使用DevCloud编译构建服务时可自动下载,无需任何额外配置,请直接跳转到步骤8

      

  5. 配置步骤“配置Maven华为开源镜像站”

    本例中假设WebServer引用了来自三方仓库“https://test.repo.com/”的依赖lib.jar,配置如下:

    要在DevCloud构建使用此类仓库,该仓库必须满足以下条件:

    1. 仓库地址在公网(大陆)可直接访问。
    2. 依赖下载无需身份认证信息。

  6. 在步骤“Maven构建”之后添加步骤“制作镜像并推送到SWR仓库”

      

  7. 配置步骤“制作镜像并推送到SWR仓库”,录入所需镜像信息。

    • 仓库地址取默认值即可。
    • 组织已于章节创建组织中说明。
    • 镜像名称自定义,注意需要符合SWR对镜像名格式要求,此处为webserver。
    • 镜像标签自定义,注意需要符合SWR对镜像名格式要求,此处为v1.1。
    • 工作目录取默认当前目录即可。
    • Dockerfile路径:准备好的Dockerfile已存放于WebServer项目根目录。当前构建目录即为项目根目录,默认值“./Dockerfile”无需更改。

  8. 保存任务并执行,最终任务详情页如下:

      

查看构建结果

  1. 进入SWR镜像仓库首页,选择对应region,

      

  2. 单击“我的镜像”,选择“制作镜像并推送到SWR仓库”步骤中填写的组织,即可查看上传的镜像。

      

疑问解答

  • 什么是构建缓存,缓存异常时怎么清理?

    DevCloud编译构建服务提供了构建缓存功能,构建时可将依赖缓存于用户私有存储空间,下次构建时直接使用,无需重复下载,可极大提高构建效率。

    • 构建缓存配置

      新建编译构建任务时,默认选择使用缓存加速构建,用户可于步骤“Maven构建” -->“高级设置”中选择是否使用缓存。

    • 清理缓存

      由于网络抖动、并发构建或其他极端情况,可能出现缓存内容异常导致构建异常,下面介绍异常缓存的清理过程。

      执行缓存清理操作前,请务必仔细阅读以下“缓存清理风险以及注意事项”:

      1. 由于缓存目录为同租户共享,频繁清理缓存会概率性导致同租户用户构建异常(常表现为xxx文件不存在),故此操作只可在缓存异常时清理一次,正常后需要务必再次编辑任务,删除清理命令。
      2. 清理缓存时尽可能使用精确的文件路径,如清理demo 1.0.0版本,请使用rm -rf /path/com/huawei/demo/1.0.0,尽量避免删除目录层级过高,导致下次构建缓慢或因网络问题导致依赖异常。
      3. 出于安全考虑,缓存清理命令只可在“Maven构建”步骤执行,在其他步骤执行此命令会导致“目录不存在”问题或清理无效。

      如您已认真阅读以上风险说明,确保理解且接受该风险,可按如下步骤清理缓存。

      1. 准备清理命令
        • 缓存清理命令格式为:rm -rf /repository/local/maven/{Group ID}/{Artifact ID}/{Version}
        • 其中需要的参数分别对应依赖坐标中的GroupID、ArtifactID、version。
        • 若依赖如下:
          <dependency>
          	<groupId>com.huawei.devcloud</groupId>
          	<artifactId>demo</artifactId>
          	<version>1.0.9-SNAPSHOT</version>
          </dependency>

          那么清理该依赖所需命令为:rm -rf /repository/local/maven/com/huawei/devcloud/demo/1.0.9-SNAPSHOT

      2. 编辑构建任务,编辑 构建步骤 -> Maven构建。
      3. 找到mvn xxxx命令位置,在此命令之前新增一行,填入步骤一准备好的清理命令,保存任务。
      4. 重新执行构建任务,成功后再次编辑,移除清理缓存命令。

  

  • Maven构建默认命令含义是什么?
    构建服务内置的默认构建命令为
    # 打包:跳过单元测试;每次构建检查更新
    mvn package -Dmaven.test.skip=true -U -e -X

    其中,各命令/参数含义为:

    • mvn package:使用maven执行打包动作,此命令会在项目target目录下生成软件包,可根据需要自行调整。
    • -Dmaven.test.skip=true:跳过单元测试,建议保留。
    • -U:每次构建强行更新SNAPSHOT类型依赖,避免默认策略导致无法下载SNAPSHOT类型依赖最新版本问题,建议保留。
    • -e:打印Maven错误详细信息,如有需要可以选择移除,需要详细日志定位构建异常时打开即可。
    • -X:打印Maven构建过程的DEBUG级别日志,如有需要可以选择移除,需要详细日志定位构建异常时打开即可。

  

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区