Serverless应用引擎SAE(Serverless App Engine)支持短时任务,能够在短时间内快速创建大量计算任务,并且在任务完成后快速释放计算资源。基于SAE短时任务实现镜像构建的实践,开发者无需构建常驻资源,支持按量付费。本文介绍如何使用SAE任务,完成从任意Dockerfile到任意镜像仓库的CI流程,实现S2I能力。

前提条件

构建镜像并上传至镜像仓库。您可以按需参考以下语言:

背景信息

kaniko是一款用于构建容器镜像的谷歌开源工具,其工作原理是根据Dockerfile逐行执行命令,执行完毕后为文件系统创建快照(Snapshot),并与上一个快照进行对比。如果内容不一致,便会创建一个新的层级,并将所有修改都写入镜像的元数据中。当Dockerfile中每条命令执行完毕后,kaniko会将新生成的镜像推送到指定的镜像仓库。更多信息,请参见kaniko

除通过编写Dockerfile的方式之外,您还可以通过Source-To-Image(S2I)的方式构建Docker镜像。因此,通过SAE和kaniko,您可以借助Dockerfile构建镜像,实现S2I能力。

本文介绍的镜像构建实践支持按量付费。若镜像构建需要依赖公网拉取,则需VPC开放公网访问能力。更多信息,请参见连接公网

通过Dockerfile构建镜像

步骤一:在SAE控制台创建配置项

您需要创建配置项,分别对应需要构建的Dockerfile和镜像仓库的配置信息。本示例以华北2(北京)地域为例。

  1. 登录SAE控制台
  2. 在左侧导航栏单击命名空间,在顶部菜单栏选择地域,单击具体命名空间名称。
  3. 在左侧导航栏单击配置项,在配置项页面单击创建
  4. 创建配置项面板,选择手动创建,配置相关参数并单击确定
    参数说明如下:
    参数 示例值
    配置项名称 输入build
    配置项描述 自定义。
    配置映射 配置以下两对键值对。
    • 键:输入dockerfile,Dockerfile为示例Dockerfile。
    • 值:
      FROM registry-vpc.cn-beijing.aliyuncs.com/****/nginx:stable
      CMD ["echo","Hello DevOps"]
    • 键:输入secert,为镜像仓库配置。
    • 值:格式如下。
      {"auths":{"https://registry-vpc.cn-beijing.aliyuncs.com":{"username":"****@test.aliyunid.com","password":"****}}}
    您可以在配置项页面查看已成功创建的配置项。

步骤二:在SAE控制台创建任务

本示例以Java语言为例,仅介绍创建任务模板的关键参数,您可以按需选择语言。参数的更多信息,请参见任务模板管理

  1. 登录SAE控制台
  2. 在左侧导航栏单击任务模板列表,在顶部菜单栏选择地域。
  3. 任务模板列表页面单击创建任务模板
  4. 任务基本信息页签,配置相关参数并单击下一步:部署配置
  5. 部署配置页签,配置相关参数并单击下一步:任务设置
    其余配置保持默认设置。
    参数 说明
    技术栈语言 选择Java
    任务部署方式 选择镜像
    Java环境 仅技术栈语言选择Java时需设置。默认选择Open JDK 8
    配置镜像 公有镜像页签输入镜像地址。格式如下:
    registry-vpc.<reigonId>.aliyuncs.com/<命名空间的名称>/<镜像仓库的名称>:<镜像版本号>
    示例如下:
    registry-vpc.cn-beijing.aliyuncs.com/sae-test/kaniko-executor:1.0
    说明 该镜像同gcr.io/kaniko-project/executor:v1.8.0
    启动命令设置
    • 启动命令:输入/kaniko/executor
    • 启动参数:添加以下两条参数,其中destination为目标镜像仓库地址。
      • --dockerfile=/workspace/Dockerfile
      • --destination=registry-vpc.cn-beijing.aliyuncs.com/****/jar-test:job
    配置管理 引用创建的配置项build,并添加对应的键与挂载路径。
    • dockerfile的挂载路径为/workspace/Dockerfile
    • secret的挂载路径为/kaniko/.docker/config.json
  6. 任务设置页签,按需配置定时规则和高级设置,并单击下一步:确认规格
  7. 确认规格页签单击确认创建
    创建完成后,您可以在任务模板列表页面查看已创建的任务信息。

步骤三:执行任务

因当前SAE任务仅支持时间触发,在成功创建任务模板后,您需要采用手动执行的方式生成任务。

  1. 登录SAE控制台
  2. 在左侧导航栏单击任务模板列表,在顶部菜单栏选择地域,单击具体任务名称。
  3. 任务模板详情页面,单击手动执行任务,跳转至任务记录页面。
    新的镜像版本已成功推送至镜像仓库。
  4. 验证结果。
    • 方式一:在任务记录页面单击目标任务id,在任务详情页面查看任务运行状态。
    • 方式二:在目标任务左侧导航栏选择日志管理 > 实时日志,在实时日志页面查看任务运行记录。
    • 方式三:登录容器镜像服务控制台,在目标实例镜像仓库内查看镜像版本是否已更新。

通过S2I构建镜像

您可以使用GitLab或者GitHub仓库托管您的代码,将本地Dockerfile改为Git中的Dockerfile。本示例以阿里云Code为例进行验证。

Dockerfile示例如下:
FROM registry.cn-beijing.aliyuncs.com/hub-mirrors/maven:3-jdk-8 AS build  
COPY src /usr/src/app/src  
COPY pom.xml /usr/src/app  
COPY settings.xml /user/src/app/settings.xml
RUN mvn -f /usr/src/app/pom.xml -s /user/src/app/settings.xml clean package -DskipTests

from registry.cn-beijing.aliyuncs.com/hub-mirrors/openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/application.jar
COPY --from=build /usr/src/app/${JAR_FILE} app.jar

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

步骤一:设置Git Token

  1. 登录阿里云Code
  2. 在左侧导航栏单击设置,然后单击个人设置页面左侧导航栏的私人令牌
  3. 私人令牌页面,设置Git Token用于访问Git仓库。

步骤二:创建任务

  1. 登录SAE控制台
  2. 在左侧导航栏单击任务模板列表,在顶部菜单栏选择地域。
  3. 任务模板列表页面单击创建任务模板
  4. 任务基本信息页签,配置相关参数并单击下一步:部署配置
  5. 部署配置页签,配置相关参数并单击下一步:任务设置
    其余配置保持默认设置。
    参数 说明
    技术栈语言 选择Java
    任务部署方式 选择镜像
    Java环境 仅技术栈语言选择Java时需设置。默认选择Open JDK 8
    启动命令设置
    • 启动命令:输入/kaniko/executor
    • 启动参数:添加以下两条参数,其中destination为目标镜像仓库地址。
      • --context=git://code.aliyun.com/****/spring-boot.git
        说明 上下文格式为git://TOKEN@github.com/acme/myproject.git#refs/heads/mybranch
      • --destination=registry-vpc.cn-beijing.aliyuncs.com/****/jar-test:job
    环境变量设置 添加两条环境变量,分别标识设置的用户名和Git Token。
    • 类型:选择自定义
    • 变量名称:分别输入GIT_PASSWORDGIT_USERNAME
    • 变量值/变量引用:分别输入步骤一设置的信息。
  6. 任务设置页签,按需配置定时规则和高级设置,并单击下一步:确认规格
  7. 确认规格页签单击确认创建
    创建完成后,您可以在任务模板列表页面查看已创建的任务信息。

步骤三:执行任务

因当前SAE任务仅支持时间触发,在成功创建任务模板后,您需要采用手动执行的方式生成任务。

  1. 登录SAE控制台
  2. 在左侧导航栏单击任务模板列表,在顶部菜单栏选择地域,单击具体任务名称。
  3. 任务模板详情页面,单击手动执行任务,跳转至任务记录页面。
    新的镜像版本已成功推送至镜像仓库。
  4. 验证结果。
    • 方式一:在任务记录页面单击目标任务id,在任务详情页面查看任务运行状态。
    • 方式二:在目标任务左侧导航栏选择日志管理 > 实时日志,在实时日志页面查看任务运行记录。
    • 方式三:登录容器镜像服务控制台,在目标实例镜像仓库内查看镜像版本是否已更新。