OpenShift 4 之通过ImageTrigger自动构建变化级联镜像

我们知道容器镜像是分层的,应用镜像一般会构建在镜像之上。常见情况是底层是操作系统镜像,再往上是中间件镜像,最上层是应用镜像。当应用代码变化后可以通过CI/CD过程自动更新应用镜像,当底层支撑镜像更新的时候我们可以使用OpenShift的BuildChain功能自动触发上层的Build过程。例如当下图中ops layer镜像变化后,OpenShift可触发上层自动构建app layer的镜像,从而使得整个应用镜像保持最新状态。
OpenShift 4 之通过ImageTrigger自动构建变化级联镜像_第1张图片

  1. 用一般用户新建一个项目,然后基于一个Dockerfile新建一个Build
$ oc new-project my-build-trigger
$ oc new-build --name=ops https://github.com/liuxiaoyu-git/welcome --context-dir=sh 
  1. 在提示Success后执行以下命令查看BuildConfig(bc)和ImageStream(is),此时应该有1个bc和2个is。之所以有2个is, 可以在https://github.com/liuxiaoyu-git/welcome/blob/master/sh/Dockerfile看到ops还依赖另一个名为busybox的Image。
$ oc get bc
NAME      TYPE      FROM      LATEST
ops       Docker    Git       8
$ oc get is
NAME      DOCKER REPO                               	               						 TAGS      UPDATED
busybox   default-route-openshift-image-registry.apps-crc.testing/my-build-trigger/busybox   latest    About an hour ago
ops       default-route-openshift-image-registry.apps-crc.testing/my-build-trigger/ops                 18 minutes ago
  1. 执行以下命令,基于另一个Dockerfile新建领一个Build
$ oc new-build --name=foo https://github.com/liuxiaoyu-git/welcome --context-dir=foo
  1. 有提示Success后执行以下命令,查看busybox的buildchain信息。 以下结果说明镜像标签为busybox:latest镜像变化后会触发bc/ops的BuildConfig,而ops:latest镜像变化后会触发bc/foo
$ oc adm build-chain busybox
istag/busybox:latest
        bc/ops
                istag/ops:latest
                        bc/foo
                                istag/foo:latest
  1. 可使用以下命令分别查看ops镜像和foo镜像的buildchain信息
$ oc adm build-chain ops
$ oc adm build-chain foo
  1. 查看和foo镜像相关的Trigger(其中第二行是基于Image变化触发的Trigger)。
$ oc set triggers bc/foo
NAME              TYPE     VALUE       AUTO
buildconfigs/foo  config               true
buildconfigs/foo  image    ops:latest  false
buildconfigs/foo  webhook  <secret>    
buildconfigs/foo  github   <secret>
  1. 查看ops和foo的Build记录
$ oc get build
NAME      TYPE      FROM          STATUS     STARTED          DURATION
ops-1     Docker    Git@ac8013d   Complete   52 seconds ago   13s
foo-1     Docker    Git@ac8013d   Complete   11 seconds ago   11s
  1. 查看ops和foo的ImageStream信息,其中会显示imagesteam对应的镜像的变化情况,例如ops的ImageStream会显示以下一条记录,说明标记为latest标签的ImageStreamTag指向的是id为2a6d33e0df5612deed84cc674e2ef3f36cc41be0c2c8fd01d8d8e0e5b385ea83的物理镜像。
$ oc describe is/ops
$ oc describe is/foo
latest
  no spec tag

 *. default-route-openshift-image-registry.apps-crc.testing/my-build-trigger/ops@sha256:2a6d33e0df5612deed84cc674e2ef3f36cc41be0c2c8fd01d8d8e0e5b385ea83
      4 hours ago
  1. 对ops启动一个新的Build
$ oc start-build bc/ops
  1. 查看Build记录。在这一过程中会发现当ops完成Build后foo会自动启动Build
$ oc get build -w
NAME      TYPE      FROM          STATUS     STARTED          DURATION
ops-1     Docker    Git@ac8013d   Complete   21 minutes ago   17s
foo-1     Docker    Git@ac8013d   Complete   17 minutes ago   15s
ops-2     Docker    Git@ac8013d   Complete   43 seconds ago   12s
foo-2     Docker    Git@ac8013d   Complete   32 seconds ago   15s
  1. 再次用(8)的命令查看ImageStream信息,会发现标签为lastest的ImageStreamTag指向了一个新的物理镜像。
latest
  no spec tag

 *. default-route-openshift-image-registry.apps-crc.testing/my-build-trigger/ops@sha256:b09d35253d8dcdb3a24c4632e65d269c019c3e37bbc388d4436acb9d037e15a8
      4 hours ago
    default-route-openshift-image-registry.apps-crc.testing/my-build-trigger/ops@sha256:2a6d33e0df5612deed84cc674e2ef3f36cc41be0c2c8fd01d8d8e0e5b385ea83
      4 hours ago
  1. 执行以下命令,删除foo和ops之间的Trigger
$ oc set triggers bc/foo --from-image=ops:latest --remove
  1. 再次查看BuildChain,发现ops:latest变化后不再触发foo的Build过程
$ oc adm build-chain busybox
istag/busybox:latest
        bc/ops
                istag/ops:lates
  1. 再次执行一次(9)的命令,并用(10)的命令查看状态,会发现不会自动触发foo的Build了。
  2. 执行以下命令,重新恢复BuildChain
$ oc set triggers bc/foo --from-image=ops:latest --remove=false
  1. 再次执行(4)的命令,确认BuildChain又恢复了。

  2. 再次执行(9)的命令新建一个ops的Build,然后通过(10)命令确认在Build完ops,会发现又会自动触发foo的Build操作,同时ImageStream会指向新生成的物理镜像。

你可能感兴趣的:(OpenShift,4,Ops,Dev)