docker - 从图像流中部署 OpenShift Origin 中的特定图像标签

标签 docker gitlab-ci openshift-origin

我已经配置了我的 Gitlab CI 管道,以便他们使用 Docker-in-Docker 构建 OCI 镜像并将其上传到 Gitlab 自己的注册表。

现在,我想将构建在我的 CI 管道中的图像部署到 OpenShift Origin。注册表中的所有图像都标有 $CI_COMMIT_SHORT_SHA (即:我不使用“最新”)。

我怎样才能做到这一点?

这是我到目前为止所尝试的:

  before_script:
    - oc login --server="$OPENSHIFT_SERVER" --token="$OPENSHIFT_TOKEN"
    - oc project myproject
  script:
    - oc tag registry.gitlab.com/myproject/backend:$CI_COMMIT_SHORT_SHA backend:$CI_COMMIT_SHORT_SHA
    - oc import-image backend:$CI_COMMIT_SHORT_SHA
    - oc set image dc/backend backend=myproject/backend:$CI_COMMIT_SHORT_SHA
    - oc rollout latest backend

oc set image 之前,一切似乎都运行良好.我希望它会更改部署配置以使用指定的图像标签( $CI_COMMIT_SHORT_SHA ),但似乎配置并没有真正修改,因此,部署仍然部署旧的(以前的)图像。

我错过了什么?有没有更好的方法从私有(private)注册表部署特定标签?

更新

这是我的部署配置:
kind: DeploymentConfig
apiVersion: apps.openshift.io/v1
metadata:
  annotations:
    openshift.io/generated-by: OpenShiftNewApp
  selfLink: /apis/apps.openshift.io/v1/namespaces/myproject/deploymentconfigs/backend
  resourceVersion: '38635053'
  name: backend
  uid: 02809a3d-...
  creationTimestamp: '2019-10-14T23:04:43Z'
  generation: 7
  namespace: myproject
  labels:
    app: backend
spec:
  strategy:
    type: Rolling
    rollingParams:
      updatePeriodSeconds: 1
      intervalSeconds: 1
      timeoutSeconds: 600
      maxUnavailable: 25%
      maxSurge: 25%
    resources: {}
    activeDeadlineSeconds: 21600
  triggers:
    - type: ConfigChange
    - type: ImageChange
      imageChangeParams:
        automatic: true
        containerNames:
          - backend
        from:
          kind: ImageStreamTag
          namespace: myproject
          name: 'backend:094971ea'
        lastTriggeredImage: >-
          registry.gitlab.com/myproject/backend@sha256:ebce...
  replicas: 1
  revisionHistoryLimit: 10
  test: false
  selector:
    app: backend
    deploymentconfig: backend
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: backend
        deploymentconfig: backend
      annotations:
        openshift.io/generated-by: OpenShiftNewApp
    spec:
      containers:
        - name: backend
          image: >-
            registry.gitlab.com/myproject/backend@sha256:ebce...
          ports:
            - containerPort: 8080
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      schedulerName: default-scheduler
status:
  observedGeneration: 7
  details:
    message: image change
    causes:
      - type: ImageChange
        imageTrigger:
          from:
            kind: DockerImage
            name: >-
              registry.gitlab.com/myproject/backend@sha256:ebce...
  availableReplicas: 1
  unavailableReplicas: 0
  latestVersion: 4
  updatedReplicas: 1
  conditions:
    - type: Available
      status: 'True'
      lastUpdateTime: '2019-10-14T23:57:51Z'
      lastTransitionTime: '2019-10-14T23:57:51Z'
      message: Deployment config has minimum availability.
    - type: Progressing
      status: 'True'
      lastUpdateTime: '2019-10-16T20:09:20Z'
      lastTransitionTime: '2019-10-16T20:09:17Z'
      reason: NewReplicationControllerAvailable
      message: replication controller "backend-4" successfully rolled out
  replicas: 1
  readyReplicas: 1

最佳答案

“解决”此问题的一种方法是 ImageChange 触发器监听特定提交 id 以外的内容。一些在 docker 中不作为标签存在的逻辑名称。说“默认”。

如果你这样做,那么在你的脚本中你唯一需要做的就是

    - oc tag registry.gitlab.com/myproject/backend:$CI_COMMIT_SHORT_SHA backend:default

然后,OpenShift 将负责更新 DeploymentConfig 中的镜像并为您推出新的部署。

OP询问了为什么不使用最新的原因。最新是一种“神奇”,因为如果您推送到注册表中没有标签的图像,它将将该标签命名为最新。这使得很容易意外覆盖它。

因此,假设您使用“最新”作为您在 ImageStream 中收听的标签。如果有人导入 imageStream 会发生什么?它将获取最新标签并覆盖您手动标记的内容。

如果你想在你的管道中使用这种控制,就像我上面所说的那样,使用你的 docker 注册表中不存在的 ImageStreamTag 名称。

关于docker - 从图像流中部署 OpenShift Origin 中的特定图像标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58421160/

相关文章:

git - Openshift Origin 安全 git 克隆错误

bash - 如何以编程方式检查 docker 机器是否存在?

javascript - 在 Docker 容器中调试 nodejs 应用程序

docker - docker中的vue pwa - 找不到模块 'chalk'

selenium-webdriver - 加载共享库时出错 : libnss3. 所以:无法打开共享对象文件:使用 Selenium Gitlab 管道和 docker 没有这样的文件或目录

json - OpenShift V3 : understanding the process with Docker

mysql - Docker Image 中无法通过套接字连接到本地 MySQL 服务器错误

powershell - 如何在Gitlab页面中将PowerShell与Gitlab CI一起使用?

gitlab - 如何使 gitlab 激活的特定运行器工作?

events - pod 的 Openshift 事件表为空