ZaC*_*aCH 3 bash containers jenkins docker jenkins-declarative-pipeline
我有 Jenkins 无法识别 bash 的问题。
我使用 golang 图像stage与agentdocker一起运行。尝试运行 sh 文件时,我收到此错误:
+ ./build/docker/docker.sh /home/jenkins/workspace/003-CGI-App-setup-ACS-build-4ZEA3UO3JRWIGZRIGIBD7BRQJV7JJ4LAKTS4XDXT6N3GDVU7Z4WA@tmp/durable-46264c73/docker.sh:line/build/script. 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'
}
}
Run Code Online (Sandbox Code Playgroud)
我的 docker.sh 文件也以 开头#!/bin/bash。
有谁知道它是否与docker镜像有关?如果是,我是否正确添加了 bash?
谢谢。
许多轻量级的 Docker 镜像,尤其是那些构建在 Alpine Linux 之上的镜像,不包含 GNU Bash。
这里最好的解决方案是重写你的脚本,而不是特别需要 bash。将其 shebang 行更改为#!/bin/sh,并将其语法限制为POSIX shell 规范中允许的内容。这对于大多数简单的“先做 A、B、C,然后是 D”风格的脚本来说已经足够了;如果您发现自己需要 bash 特定的功能(如数组),请考虑使用更强大的脚本语言(如 Python)。
具体在单行
sh 'export PATH=/bin/bash:$PATH'
Run Code Online (Sandbox Code Playgroud)
sh命令都在自己的执行环境中运行,环境干净,因此前面sh语句中的环境变量设置不会影响后面的语句;此声明是禁止操作的。$PATH是目录,而不是单个文件。/bin几乎是必需的,$PATH并且它在所有标准执行环境中。(如果/bin/bash存在,则显式bash -c '...'命令和#!/bin/bashshebang 行会找到它。)(造成此类问题的另一个常见原因是混合 Windows/Linux 环境,其中实际的 shebang 行以 DOS 样式的 CR/LF 两字符换行符结尾,并且环境无法运行/bin/bash\r。)
| 归档时间: |
|
| 查看次数: |
3272 次 |
| 最近记录: |