Jenkins Kubernetes插件不执行Docker映像的入口点

时间:2019-07-11 12:03:32

标签: docker jenkins kubernetes jenkins-pipeline kubernetes-pod

我一般对Jenkins Kubernetes插件和Kubernetes还是陌生的-https://github.com/jenkinsci/kubernetes-plugin

我想将插件用于CI中的E2E测试设置。

在我的Jenkinsfile内,有一个podTemplate,其外观和用法如下:

def podTemplate = """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: website
    image: ${WEBSITE_INTEGRATION_IMAGE_PATH}
    command:
      - cat
    tty: true
    ports:
     - containerPort: 3000
  - name: cypress
    resources:
      requests:
        memory: 2Gi
      limit:
        memory: 4Gi
    image: ${CYPRESS_IMAGE_PATH}
    command:
      - cat
    tty: true
"""

pipeline {
  agent {
    label 'docker'
  }
  stages {
    stage('Prepare') {
      steps {
        timeout(time: 15) {
          script {
            ci_machine = docker.build("${WEBSITE_IMAGE_PATH}")
          }
        }
      }
    }

    stage('Build') {
      steps {
        timeout(time: 15) {
          script {
            ci_machine.inside("-u root") {
              sh "yarn build"
            }
          }
        }
      }

      post {
        success {
          timeout(time: 15) {
            script {
              docker.withRegistry("https://${REGISTRY}", REGISTRY_CREDENTIALS) {
                integrationImage = docker.build("${WEBSITE_INTEGRATION_IMAGE_PATH}")
                integrationImage.push()
              }
            }
          }
        }
      }
    }

    stage('Browser Tests') {
      agent {
        kubernetes {
          label "${KUBERNETES_LABEL}"
          yaml podTemplate
        }
      }
      steps {
        timeout(time: 5, unit: 'MINUTES') {
          container("website") {
            sh "yarn start"
          }

          container("cypress") {
            sh "yarn test:e2e"
          }
        }
      }
  }
}


Dockerfile构建图像的过程中,我添加了ENTRYPOINT

ENTRYPOINT ["bash", "./docker-entrypoint.sh"]

但是,似乎它不是由kubernetes插件执行的。

我想念什么吗?

1 个答案:

答案 0 :(得分:2)

根据Define a Command and Arguments for a Container文档:

  

您在配置文件中定义的命令和参数   覆盖容器提供的默认命令和参数   图片。

This表总结了Docker和Kubernetes使用的字段名称:

| Docker field name | K8s field name |
|------------------:|:--------------:|
|    ENTRYPOINT     |     command    |
|       CMD         |      args      |

定义command意味着忽略您的Dockerfile ENTRYPOINT

  

当您覆盖默认的ENTRYPOINTCMD时,将应用以下规则:

     
      
  • 如果您为容器提供command而不提供args,则仅使用提供的command。 Docker映像中定义的默认ENTRYPOINT和默认CMD被忽略。
  •   
  • 如果您仅为容器提供args,则默认为ENTRYPOINT   使用您提供的args运行Docker映像中定义的命令。
  •   

因此,您需要用command替换pod模板中的args,这将保留Dockerfile ENTRYPOINT(相当于Dockerfile CMD)。