Плагин Jenkins Kubernetes не выполняет точку входа образа Docker

Я новичок в плагине Jenkins Kubernetes и Kubernetes в целом — https://github.com/jenkinsci/kubernetes-plugin

Я хочу использовать плагин для настройки тестов E2E внутри моего CI.

Внутри моего 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.

Я что-то упускаю?


person Kosmetika    schedule 11.07.2019    source источник
comment
В зависимости от вашего конвейерного кода конечный агент с kubernetes будет игнорироваться, поскольку вы задали глобально агент docker.   -  person Matt Schuchard    schedule 11.07.2019
comment
@MattSchuchard, но это не так! Внутри container("website") { я могу сделать несколько sh вызовов, чтобы изучить содержимое образа Docker, который был отправлен на шаге post.   -  person Kosmetika    schedule 11.07.2019


Ответы (1)


Согласно Определение команды и аргументов для контейнера docs:

Команда и аргументы, которые вы определяете в файле конфигурации, переопределяют команду и аргументы по умолчанию, предоставляемые образом контейнера.

Эта таблица суммирует поле имена, используемые Docker и Kubernetes:

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

Определение command подразумевает игнорирование вашего Dockerfile ENTRYPOINT:

Когда вы переопределяете ENTRYPOINT и CMD по умолчанию, применяются следующие правила:

  • Если вы указываете command, но не args для контейнера, используется только предоставленный command. ENTRYPOINT по умолчанию и CMD по умолчанию, определенные в образе Docker, игнорируются.
  • Если вы указываете только args для контейнера, ENTRYPOINT по умолчанию, определенный в образе Docker, запускается с предоставленным вами args.

Поэтому вам нужно заменить command в вашем шаблоне модуля на args, что сохранит ваш файл Dockerfile ENTRYPOINT (действующий эквивалент файла Dockerfile CMD).

person Eduardo Baitello    schedule 11.07.2019