Я только что столкнулся с проблемой при запуске декларативного конвейера Jenkins на сервере Jenkins, который сам работает внутри Docker, имея доступ к docker.sock
с хоста.
Структура конвейера такова. довольно просто:
pipeline {
agent {
docker { image 'gradle:jdk11' }
}
stages {
stage('Checkout') {
steps {
// ...
}
}
stage('Assemble public API documentation') {
environment {
// ...
}
steps {
// ...
}
}
stage('Generate documentation') {
steps {
// ...
}
}
stage('Upload documentation to Firebase') {
agent {
docker {
image 'node:12'
reuseNode false
}
}
steps {
// ...
}
}
}
}
Идея состоит в том, чтобы запустить три этапа в первом контейнере, а затем создать новый контейнер для заключительного этапа. При входе на последний этап печатается следующее:
[Pipeline] stage
[Pipeline] { (Upload documentation to Firebase)
[Pipeline] getContext
[Pipeline] isUnix
[Pipeline] sh
+ docker inspect -f . node:12
/var/jenkins_home/workspace/publish_public_api_doc@tmp/durable-bc4d65d1/script.sh: 1: /var/jenkins_home/workspace/publish_public_api_doc@tmp/durable-bc4d65d1/script.sh: docker: not found
[Pipeline] isUnix
[Pipeline] sh
+ docker pull node:12
/var/jenkins_home/workspace/publish_public_api_doc@tmp/durable-297d223a/script.sh: 1: /var/jenkins_home/workspace/publish_public_api_doc@tmp/durable-297d223a/script.sh: docker: not found
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
$ docker stop --time=1 367647f97c9eed52bf85c13c2bc2203bb7194adac803d37cab0e0d0435325efa
$ docker rm -f 367647f97c9eed52bf85c13c2bc2203bb7194adac803d37cab0e0d0435325efa
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 127
Finished: FAILURE
Я не совсем понимаю, что здесь происходит. Чтобы отладить это, я вошел в систему на этой машине и выполнил команду docker
с хоста, а также из запущенного контейнера Jenkins, и он заработал. Это настроено так, что клиент Docker установлен в образе, то есть сам двоичный файл не используется совместно с контейнером. Поскольку команда docker
«не найдена», единственное объяснение, которое у меня есть, это то, что команда docker
для запуска агента для заключительного этапа не выполняется в Jenkins «верхнего уровня». контейнер, но в JDK, в котором нет исполняемого файла docker
. Однако это могло бы показаться неожиданным, если бы не ошибкой. Я был бы благодарен, если бы кто-нибудь пролил свет на это.