Смонтируйте том, чтобы поделиться результатом контейнера докера в файле jenkinsfile - PullRequest
0 голосов
/ 20 марта 2019

Ну, моя проблема:

У меня есть общая папка emptyDirVolume(mountPath: '/home', memory: false),

и я запускаю автоматические тесты файла docker, и эти тесты сохраняются в папке в домашнем каталоге контейнера docker. Что я хочу сделать, так это поделиться этим каталогом с узлом контейнера, чтобы загрузить результаты в другой контейнер с gsutils.

То, что я делаю, это docker run -v /home:/home/tests test, но домашний каталог контейнера узла пуст. Я локально проверил свой dockerfile и работает, это выполнимо?

Я опубликую код jenkinsfile и файла docker.

JENKINSFILE:

GString podName = "${name}-${UUID.randomUUID().toString()}"
podTemplate(name: "jnlp",
  label: podName,
  namespace: "jenkins",
  containers: [
    containerTemplate(name: 'node', image: 'gcr.io/xyz', ttyEnabled: true),  
  ],
  volumes: [
    hostPathVolume(mountPath: '/usr/bin/docker', hostPath: '/usr/bin/docker'),
    hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
    emptyDirVolume(mountPath: '/home', memory: false),
    secretVolume(secretName: 'kube-jenkins-gcloud-secret', mountPath: '/usr/opt/gcloud/.config')
  ])
  {
    node(podName) {
      //stageWithSlackNotification() {
        stage('build docker image') {
          checkout scm
          container('node') {
            sh "docker build -t test ."
          }
        }

        stage('test') {
          checkout scm  
          container('node') {
            currentBuild.displayName = env.BUILD_NUMBER
            currentBuild.description = env.BUILD_NUMBER

            sh "docker run -v /home:/home/tests test"
          }
        }

         stage('testv2') {
          checkout scm  
          container('node') {

            sh "ls /home"
          }
        }

      //}
    }
  }

DOCKERFILE

FROM gcr.io/xyz

# Create app directory
RUN mkdir -p /usr/opt/hold-ats
WORKDIR /usr/opt/hold-ats

COPY package* ./

RUN npm install

COPY src src

RUN mkdir -p /home/tests

CMD ["./node_modules/.bin/newman", "run", "src/collections/smoke_tests.json", "-e",  "src/environments/dev.json", "--reporter-htmlextra-export", "/home/tests" ,"--reporter-htmlextra-darkTheme", "--reporter-htmlextra-testPaging", "-r", "htmlextra"]

Кто-нибудь знает?

Спасибо!

1 Ответ

1 голос
/ 20 марта 2019

Проблема связана с использованием Docker deamon при выполнении этапов конвейера jenkins внутри контейнера, управляемого Kubernetes.

Когда вы используете docker run, у вас есть докер deamon нахост-машина, как объявлено здесь:

hostPathVolume(mountPath: '/usr/bin/docker', hostPath: '/usr/bin/docker'),
hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),

Итак, когда вы используете отображение тома -v /home:/home/tests, используется каталог /home хоста, а НЕ каталог /home контейнера, созданногоплагин kubernetes.

Чтобы решить эту проблему, вы можете сделать одно из двух:

  1. Сконфигурировать другой демон docker внутри управляемого контейнера kubernetes, который выполняет этап конвейера.
  2. Отобразить один и тот же каталог, чтобы он был доступен как для контейнера docker run, так и для контейнера kubernetes.

Второй вариант кажется более простым, IMHO, и его можно выполнить с помощью:

  • Добавить новое сопоставление томов в шаблон podTemplate kubernetes: hostPathVolume(mountPath: '/home/tests', hostPath: '/tmp/tests'),
  • Использовать тот же каталог при запуске вашего контейнера: docker run -v /tmp/tests:/home/tests test

Веселиться !!

...