全部產品
Search
文件中心

Function Compute:鏡像構建並且推送到鏡像倉庫

更新時間:Jul 06, 2024

通過流水線的內建鏡像構建工作範本,可以實現鏡像的構建並自動推送到ACR鏡像倉庫。流水線執行環境分為預設執行環境和專有執行環境兩種模式。本文分別介紹如何在預設執行環境下和專有執行環境下構建鏡像,以及如何使用鏡像構建和部署進行完整的CI/CD流程。

預設構建環境使用限制

  • 磁碟空間不超過10 GB。

  • 構建任務逾時最大不能超過15分鐘。

  • GitHub代碼源使用海外新加坡地區,GitLab或Codeup使用中國杭州地區。

  • 不支援固定IP地址以及網段,不支援IP白名單方式訪問其他網站。

如果預設構建環境不滿足您的需求,您可以使用專有執行環境構建鏡像。具體資訊,請參見使用專有執行環境構建鏡像

前提條件

  • 如果您使用的是私人ACR鏡像倉庫,需要為角色AliyunFCServerlessDevsRole授予ACR的寫入權限,例如AliyunContainerRegistryFullAccess或者自訂權限原則。具體操作,請參見授予RAM使用者自訂策略

  • 如果您使用的是ACR企業版鏡像倉庫,需要使用流水線專有執行環境在指定VPC內執行流水線構建任務。具體操作,請參見使用專有執行環境構建鏡像

  • 如果您使用鏡像構建任務,需要將資源描述檔案s.yaml中的component: fc build --use-docker鉤子刪除,以保證部署階段不執行鏡像構建。

使用預設執行環境構建鏡像

您可以通過Function Compute控制台,找到應用,在流水線管理頁簽的流水線詳情地區,選擇鏡像構建工作範本,使用工作範本更新右側流水線YAML。操作流程為工作範本(下圖中①)->構建(下圖中②)->鏡像構建(下圖中③)->更新右側YAML檔案(下圖中④)。

image.png

完整的鏡像構建流水線YAML樣本如下。

kind: Pipeline
name: "image-build-pipeline"
description: 'demo pipeline'
labels:
  myLabel: image-build
spec:
  templateSpec:
    tasks:
      - name: build-push
        context:
          data:
            # 任務顯示名稱字,用於在控制台中展示。
            displayName: 鏡像構建
            # 開啟任務執行,預設關閉。
            enable: true
            # 指定構建資訊。
            build: 
              # 指定dockerfile,使用代碼倉庫中的相對路徑。不指定時預設為./Dockerfile。
              dockerfile: code/Dockerfile
              # 指定鏡像名,必須是ACR鏡像。
              image: registry-vpc.cn-hangzhou.aliyuncs.com/pipeline-demo/demo-repo:latest
              # 指定構建上下文目錄。不指定時預設使用Dockerfile所在目錄。
              context: ./context
        # 工作範本指定為內建的模板build-image-task。
        taskTemplate: build-image-task
        runAfters: []

使用專有執行環境構建鏡像

如果預設執行環境無法滿足需求,您可以使用流水線專有執行環境,讓流水線任務在您自己的帳號下運行。使用專有執行環境,可以自訂流水線任務的地區、網路、資源規格、逾時等配置。關於流水線專有執行環境的介紹,請參見流水線執行環境

您可以通過圖形化或者YAML編輯的方式來配置流水線執行環境。

重要

專有執行環境會讓構建任務在您自己的帳號的Function Compute下執行,因此會產生相關費用。具體操作,請參見計費概述

使用NAS進行緩衝來構建鏡像

如果您的Dockerfile中基礎鏡像很大,例如,使用了一些模型或者CUDA執行環境,每次構建都拉取基礎鏡像會影響構建速度並且還可能導致磁碟空間不足問題,此時您可以使用NAS來緩衝基礎鏡像解決以上問題。

流程介紹

  1. 使用流水線專有執行環境並且綁定VPC以及NAS。

  2. 使用鏡像預熱將基礎鏡像緩衝到NAS中。

  3. 使用NAS中的緩衝來構建鏡像。

YAML樣本

kind: Pipeline
name: "image-build-use-cache-pipeline"
description: 'demo pipeline'
labels:
  myLabel: image-build-use-cache
spec:
  templateSpec:
    context:
      data:
        # 指定專有執行環境。
        runnerConfig:
          regionId: cn-hangzhou
          logConfig:
            project: demo-project
            logstore: demo-logstore
          # 網路設定,和NAS所在VPC保持一致。
          vpcConfig:
            securityGroupId: sg-xxxx
            vSwitchIds:
              - vsw-xxx
            vpcId: vpc-xxxx
          # NAS配置。
          nasConfig:
            groupId: 0
            userId: 0
            mountPoints:
              - enableTLS: false
                # 緩衝使用的本地目錄。
                mountDir: /mnt/image-cache
                # 緩衝存放的遠端目錄。
                serverAddr: xxxx.cn-hangzhou.nas.aliyuncs.com:/image-cache
          # 執行個體規格建議8核32G,磁碟10GB。
          cpu: 8
          memory: 32768
          diskSize: 10240
          # 構建逾時時間。
          timeout: 1800
    tasks:
      - name: build-push
        context:
          data:
            # 任務顯示名稱字,用於在控制台中展示。
            displayName: 鏡像構建
            # 開啟任務執行,預設關閉
            enable: true
            # 將基礎鏡像預熱到緩衝。
            warm: 
              # 需要預熱的基礎鏡像,可以指定多個。
              images:
              - registry-vpc.cn-hangzhou.aliyuncs.com/pipeline-demo/base-image-1:debug
              - registry-vpc.cn-hangzhou.aliyuncs.com/pipeline-demo/base-image-2:debug
              # 基礎鏡像要緩衝的路徑。
              cacheDir: "/mnt/image-cache" 
            # 指定構建資訊。
            build: 
              # 指定dockerfile,使用代碼倉庫中的相對路徑。不指定時預設為./Dockerfile。
              dockerfile: code/Dockerfile
              # 指定鏡像名,必須是ACR鏡像。
              image: registry-vpc.cn-hangzhou.aliyuncs.com/pipeline***/demo***:latest
              # 使用基礎鏡像的緩衝路徑。
              cacheDir: "/mnt/image-cache" 
        # 工作範本指定為內建的模板build-image-task。
        taskTemplate: build-image-task
        runAfters: []

使用緩衝後,如果命中緩衝,會列印Found manifest at ...的資訊。

image.png

您也可以將構建和緩衝預熱任務拆分,單獨進行預熱以及構建。YAML樣本如下。

- name: only-warm
  context:
    data:
      enable: true
      # 將基礎鏡像預熱到緩衝。
      warm: 
        # 需要預熱的基礎鏡像,可以指定多個。
        images:
        - registry-vpc.cn-hangzhou.aliyuncs.com/pipeline-demo/base-image-1:debug
        - registry-vpc.cn-hangzhou.aliyuncs.com/pipeline-demo/base-image-2:debug
        # 基礎鏡像要緩衝的路徑。
        cacheDir: "/mnt/image-cache"
        # 指定ACR企業版執行個體。
        instanceID: cri-xxxx
  # 工作範本指定為內建的模板build-image-task。
  taskTemplate: build-image-task
  runAfters: []
- name: only-build
  context:
    data:
      enable: true
      # 指定構建資訊。
      build: 
        # 指定dockerfile,使用代碼倉庫中的相對路徑。不指定時預設為./Dockerfile。
        dockerfile: code/Dockerfile
        # 指定鏡像名,必須是ACR鏡像。
        image: registry-vpc.cn-hangzhou.aliyuncs.com/pipeline-demo/demo-repo:latest
        # 使用基礎鏡像的緩衝路徑。
        cacheDir: "/mnt/image-cache" 
  # 工作範本指定為內建的模板build-image-task。
  taskTemplate: build-image-task
  runAfters: [only-warm]

構建ACR企業版鏡像

如果您使用ACR企業版執行個體,ACR企業版有網路的存取控制。

由於流水線預設執行環境不支援固定公網以及內網IP網段,因此流水線預設執行環境無法訪問ACR企業版執行個體,需要使用流水線專有執行環境來訪問您的ACR企業版執行個體。

流程介紹

  1. 使用流水線專有執行環境並且綁定VPC,VPC需要和您的ACR企業版執行個體網路互連,建議您直接使用ACR企業版執行個體所在的VPC以及交換器。您也可以指定其他VPC並且完成配置專用網路的存取控制。具體操作,請參見配置專用網路的存取控制

  2. 指定ACR企業版執行個體構建鏡像。

  3. 建議您對鏡像倉庫開啟鏡像加速,並且鏡像Tag指定_accelerated加速尾碼。流水線鏡像構建任務會自動推送原始的鏡像並且等待加速鏡像轉換完成。更多資訊,請參見按需載入容器鏡像

YAML樣本

kind: Pipeline
name: "image-build-use-cache-pipeline"
description: 'demo pipeline'
labels:
  myLabel: image-build-use-cache
spec:
  templateSpec:
    context:
      data:
        # 指定專有執行環境。
        runnerConfig:
          regionId: cn-hangzhou
          logConfig:
            project: demo-project
            logstore: demo-logstore
          # 網路設定,需要和ACR企業版執行個體網路互連。
          vpcConfig:
            securityGroupId: sg-xxxx
            vSwitchIds:
              - vsw-xxx
            vpcId: vpc-xxxx
          # 執行個體規格。
          cpu: 8
          memory: 32768
          diskSize: 10240
          # 構建逾時時間。
          timeout: 1800
    tasks:
      - name: build-push
        context:
          data:
            # 任務顯示名稱字,用於在控制台中展示。
            displayName: 鏡像構建
            # 開啟任務執行,預設關閉。
            enable: true
            # 指定構建資訊。
            build:
              # 指定dockerfile,使用代碼倉庫中的相對路徑。不指定時預設為./Dockerfile。
              dockerfile: code/Dockerfile
              # 指定鏡像名,建議開啟鏡像加速,並且指定_accelerated加速尾碼。
              image: demo-registry-vpc.cn-hangzhou.aliyuncs.com/pipeline***/demo***:debug_accelerated
              # 指定ACR企業版執行個體。
              instanceID: cri-xxxx
            
        # 工作範本指定為內建的模板build-image-task。
        taskTemplate: build-image-task
        runAfters: []

使用鏡像構建和部署功能進行完整的CI/CD流程

推薦您使用鏡像構建工作範本以及自訂工作範本完成構建、部署的自動化流程。

  • 每次CI過程都推薦為鏡像打上新的Tag,並且Tag和本次Commit關聯。

  • CD過程中使用全新的Tag部署。

通過下面的樣本可以完成上述過程。

  • 對於構建任務,使用流水線YAML預置變數<% .git.shortCommitId %>作為鏡像的Tag,該變數表示本次Git操作中HEAD Commit的CommitId的前7位,例如image: registry-vpc.cn-hangzhou.aliyuncs.com/demo/demo-image:<% .git.shortCommitId %>。流水線YAML內建變數,請參見使用YAML檔案描述流水線

  • 對於部署任務,注入一個環境變數GIT_COMMIT,變數的值為<% .git.shortCommitId %>。

  • 修改s.yaml,將自訂鏡像的Tag改成${env(GIT_COMMIT)},表示引用該環境變數。通過這種變數賦值,就可以讓s.yaml動態修改部署鏡像Tag。

完整樣本如下。

  • 流水線YAML

    # 提交流水線執行。
    kind: Pipeline
    # 流水線執行名稱,需要全域唯一。如果流水線模板存在,則不能成功提交流水線執行。
    # 推薦使用commitID與時間戳記構造唯一的名稱。
    name: "p-<% .git.shortCommitId %>-<% .currentTimestampMs %>"
    # 一些任意的描述資訊。
    description: 'demo pipeline'
    # 添加任意的labels,用於查詢過濾。
    # 應用中心會在提交時也會添加其他labels。
    labels:
      myLabel: my-cicd-example
    spec:
      context:
        data:
          appName: <% .appName %>
      templateSpec:
        context:
          data:
            envName: <% .envName %>
            deployFile: s.yaml
        tasks:
          # 鏡像構建。
          - name: build-image
            context:
              data:
                displayName: 鏡像構建
                enable: true
                build: # 鏡像構建。
                  dockerfile: code/Dockerfile
                  # 使用 <% .git.shortCommitId %> 將tag和commit相關聯。
                  image: registry-vpc.cn-hangzhou.aliyuncs.com/demo/demo-image:<% .git.shortCommitId %>
            taskTemplate: build-image-task
            runAfters: []
        	# 部署。
          - name: build-and-deploy
            context:
              data:
                displayName: 部署
                enable: true
                # 動態注入本次部署的環境變數。
                envVars:
                  GIT_COMMIT: <% .git.shortCommitId %>
                steps:
                  - plugin: "@serverless-cd/checkout"
                  - plugin: "@serverless-cd/s-setup"
                  - plugin: "@serverless-cd/s-deploy"
            taskTemplate: serverless-runner-task
            runAfters:
              - name: build-push
  • s.yaml

    edition: 3.0.0
    name: demo
    access: 'default'  #  密鑰別名。
    
    resources:
      function: 
        component: fc3
        props:
          region: 'cn-hangzhou'
          functionName: demo
          runtime: custom-container
          customContainerConfig:
            # 引用部署任務注入的環境變數。
            image: registry-vpc.cn-hangzhou.aliyuncs.com/demo***/demo-ima***:${env(GIT_COMMIT)}
            port: 9000
          memorySize: 4096
          timeout: 3600