我有一个需要通过Jenkins部署的BookStore Spring项目。安装在本地计算机(macOS)和Jenkinsfile中的Docker,如下所示
pipeline
{
agent
{
docker
{
image 'maven:3-alpine'
//This exposes application through port 8081 to outside world
args '-u root -p 8081:8081 -v /var/run/docker.sock:/var/run/docker.sock '
}
}
stages
{
stage('Build')
{
steps
{
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test')
{
steps {
//sh 'mvn test'
sh 'echo "test"'
}
post {
always {
//junit 'target/surefire-reports/*.xml'
sh 'echo "test"'
}
}
}
stage('Deliver for development')
{
when {
branch 'development'
}
steps {
sh './jenkins/scripts/deliver-for-development.sh'
input message: 'Finished using the web site? (Click "Proceed" to continue)'
}
}
stage('Deploy for production')
{
when {
branch 'production'
}
steps {
sh './jenkins/scripts/deploy-for-production.sh'
input message: 'Finished using the web site? (Click "Proceed" to continue)'
}
}
stage('Deliver') {
when {
branch 'production'
}
steps {
sh 'bash ./jenkins/deliver.sh'
}
}
}
}我在Jenkins中创建了多分支管道,当我尝试运行它时,我得到了以下错误:
/Users/Shared/Jenkins/Home/workspace/BookStore_master-VPWQ32ZZPV7CVOXNI4XOB3VSGH56MTF3W34KXKZFJKOBMSGLRZQQ@tmp/durable-70dd5a81/script.sh: line 2: docker: command not found
script returned exit code 127这在我看来很奇怪,因为在本地机器中可以获得对接器,而且还配置了Global Tool Configuration部分,并提供了如下所示的适当详细信息。我查看了几个帖子,但到目前为止,这些解决方案都没有奏效。

发布于 2018-06-19 20:09:14
我能够通过从全局工具配置部分检索Docker和Maven值来解决这个问题,并将它们添加到环境路径中,如下所示
更新的Jenkinsfile
node {
stage('Initialize')
{
def dockerHome = tool 'MyDocker'
def mavenHome = tool 'MyMaven'
env.PATH = "${dockerHome}/bin:${mavenHome}/bin:${env.PATH}"
}
stage('Checkout')
{
checkout scm
}
stage('Build')
{
sh 'uname -a'
sh 'mvn -B -DskipTests clean package'
}
stage('Test')
{
//sh 'mvn test'
sh 'ifconfig'
}
stage('Deliver')
{
sh 'bash ./jenkins/deliver.sh'
}
}发布于 2018-09-13 15:33:07
由于这个线程https://stackoverflow.com/a/50029962/6943587,我也遇到了同样的问题并得以解决。
您需要指定码头标签,也就是哪个代理拥有码头。据我所知,有两种方法可以做到这一点。
(选项1-首选)在Jenkinsfile中设置码头标签
将代理设置为带有码头代理标签的码头映像。
// Jenkinsfile
pipeline {
// Assign to docker agent(s) label, could also be 'any'
agent {
label 'docker'
}
stages {
stage('Docker node test') {
agent {
docker {
// Set both label and image
label 'docker'
image 'node:7-alpine'
args '--name docker-node' // list any args
}
}
steps {
// Steps run in node:7-alpine docker container on docker agent
sh 'node --version'
}
}
stage('Docker maven test') {
agent {
docker {
// Set both label and image
label 'docker'
image 'maven:3-alpine'
}
}
steps {
// Steps run in maven:3-alpine docker container on docker agent
sh 'mvn --version'
}
}
}
} (选项2)在配置中设置坞标
根据Jenkins文档这里,在Jenkins配置中的“管道模型定义”下设置“码头标签”。这将只在带有此标签的代理上运行管道构建。然后你可以像这样创建你的管道..。
// Jenkinsfile
pipeline {
// "Top-level" agent is assigned to docker agents via Jenkins pipeline configuration
agent none
stages {
stage('Docker node test') {
agent {
docker {
image 'node:7-alpine'
args '--name docker-node' // list any args
}
}
steps {
// Steps run in node:7-alpine docker container on docker agent
sh 'node --version'
}
}
stage('Docker maven test') {
agent {
docker {
image 'maven:3-alpine'
}
}
steps {
// Steps run in maven:3-alpine docker container on docker agent
sh 'mvn --version'
}
}
}
}希望这能有所帮助
选项1比选项2更可取,因为Jenkins文件配置在哪台机器上运行码头代理,而不依赖将来可以删除或编辑的Jenkins管道配置。
发布于 2020-12-13 07:02:50
我在Mac电脑上也遇到了同样的问题,下面的答案帮助了我。
docker:命令not ( mini )只发生在jenkins shell步骤中,而在命令提示符下工作。。
解决方案是将下面的行添加到/usr/local/Cellar/jenkins-lts/2.176.3/homebrew.mxcl.jenkins-lts.plist文件中,以便Jenkins能够从主机上找到docker命令。
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Docker.app/Contents/Resources/bin/:/Users/Kh0a/Library/Group\ Containers/group.com.docker/Applications/Docker.app/Contents/Resources/bin</string>
</dict>
https://stackoverflow.com/questions/50916740
复制相似问题