使用SAE任务实现镜像构建及S2I解决方案

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"]
    • 键:输入secret,为镜像仓库配置。

    • 值:格式如下。

      {"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。本示例以Codeup为例进行验证。

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. 登录Codeup

  2. 在顶部菜单栏,单击个人账号,然后单击个人设置

  3. 个人设置页面左侧导航栏,单击个人访问令牌,然后在私人令牌页面,单击创建访问令牌,设置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,在任务详情页面查看任务运行状态。

    • 方式二:在目标任务左侧导航栏选择日志管理 > 实时日志,在实时日志页面查看任务运行记录。

    • 方式三:登录容器镜像服务控制台,在目标实例镜像仓库内查看镜像版本是否已更新。