Понимание шагов Jenkinsfile для агента Docker

У меня есть Jenkinsfile со следующими шагами:

stage('build') {
      agent {
           docker {
               image 'maven:3-alpine'
               args '-v /ec2-user/.m2:/root/.m2'
           }
      }
      steps {
        git(url: 'https://github.com/user/project.git', branch: 'master')
        sh 'cp /home/application-prod.properties src/main/resources'
        sh 'mvn clean install'
      }
    }

Согласно документам, Дженкинс должен выполнить шаги на этом этапе во вновь созданном контейнере, используя этот образ.

Если это так, то почему команда sh второго шага выполняется успешно? Как он может получить доступ к файлу на хосте Jenkins?

Мне кажется, что команды выполняются на хосте Jenkins. Тогда почему mvn clean install работает нормально? На хосте Jenkins не установлен Maven.


person VSh    schedule 27.03.2019    source источник


Ответы (1)


Поскольку это обычный случай, когда вы хотите получить доступ к содержимому вашего рабочего пространства, Jenkins автоматически монтирует его как том в контейнер. В противном случае, вероятно, в 99% всех заданий нужно было бы указать, что извлеченный репо должен быть смонтирован в контейнер.

Вы должны увидеть параметры -v в выводе сборки, когда она выдает команду docker run.

person StephenKing    schedule 27.03.2019
comment
Спасибо, я вижу это в логах. Но каталог /home с файлом реквизита не находится внутри сопоставленного каталога рабочей области и по умолчанию не сопоставлен с контейнером. Как контейнер получает к нему доступ? - person VSh; 28.03.2019
comment
Я вижу, каков результат сборки? - person StephenKing; 28.03.2019
comment
Сборка успешно выполняется, и я получаю действительный артефакт jar с предполагаемым application-prod.properties внутри каталога /target в рабочей области Jenkins. Также я заметил, что в логах каталог рабочей области Jenkins отображается не с флагом -v, а с -w (как рабочий каталог), но я все еще могу' не понял, как осуществляется доступ к каталогу /home. - person VSh; 28.03.2019
comment
Наверное, я понял. Мой хост Jenkins также работает в контейнере. И когда контейнер Maven запущен, есть также параметр --volumes-from (наряду с -w), который сопоставляет все тома контейнера Jenkins с контейнером Maven. Спасибо за помощь! - person VSh; 28.03.2019