我对詹金斯(Jenkins)无法识别bash有疑问。
我使用golang映像与docker stage
一起运行agent
。尝试运行sh文件时,出现此错误:
+ ./build/docker/docker.sh /home/jenkins/workspace/003-CGI-App-setup-ACS-build-4ZEA3UO3JRWIGZRIGIBD7BRQJV7JJ4LAKTS4XDXT6N3GDVU7Z4WA@tmp/durable-46264c73/script.sh:第1行:./ build / docker / docker.sh:未找到
这是我的阶段:
stage('Build & publish') {
agent {
docker {
image 'golang:1.10-alpine3.7'
}
}
steps {
checkout scm
unstash 'war'
sh 'export PATH=/bin/bash:$PATH'
sh 'cp XXX/XXX/target/*.war build/docker/ROOT.war'
sh 'chmod 777 ./build/docker/docker.sh'
sh 'go build -o XXX'
sh './XXX build'
sh './build/docker/docker.sh'
}
}
我的docker.sh文件也以#!/bin/bash
开头。
有人知道它是否与Docker映像有关吗?如果是,我是否正确添加bash?
谢谢。
答案 0 :(得分:3)
许多重量较轻的Docker映像,尤其是基于Alpine Linux构建的映像,都不包含GNU Bash。
这里最好的解决方案是重写脚本,使其不特别要求bash。将其shebang行更改为#!/bin/sh
,并将其语法限制为POSIX shell specification所允许的语法。对于大多数简单的“先执行A,B,C然后执行D”样式脚本,这已经足够了。如果您发现可以使用bash特有的功能(例如数组),请考虑使用更强大的脚本语言(例如Python)。
特别是在单行中
sh 'export PATH=/bin/bash:$PATH'
sh
命令都在干净的环境下在其自己的执行环境中运行,因此先前sh
语句中的环境变量设置不会影响后面的语句;这句话是空话。$PATH
的元素是目录,而不是单个文件。/bin
几乎必须位于$PATH
上,并且在所有标准执行环境中都必须存在。 (如果存在/bin/bash
,则可以使用明确的bash -c '...'
命令和#!/bin/bash
shebang行找到。)(此类问题的另一个常见原因是Windows / Linux混合环境,其中实际的Shebang行以DOS样式的CR / LF两个字符的换行符结尾,并且该环境无法运行/bin/bash\r
。)