分析:
经验证,该问题在使用Jenkins官方文档中推荐的docker镜像jenkinsci/blueocean
才会出现。
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
我的解决方法:
改用最新的Jenkins docker镜像就不会遇到:
我安装的是最新的Jenkins docker镜像:
docker pull jenkins/jenkins:lts
然后运行镜像:
docker run \
-u root \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkins/jenkins:lts
注意
docker run
时,镜像名为jenkins/jenkins:lts
,而不是jenkins/jenkins
。两者不同。
原因推测
为什么jenkinsci/blueocean
镜像会出现这个问题还未定位到。
但在试错的过程中有如下发现:
jenkinsci/blueocean
镜像基于Alpine Linux
系统;jenkins/jenkins:lts
基于Debian
系统jenkinsci/blueocean
的shell是ash,即阉割版的bash;而jenkins/jenkins:lts
时完整的bash。可通过vi /etc/passwd
命令查看- 起初怀疑是软连接的原因。但是按照网上的说法进行配置,还是不行。后来发现
jenkinsci/blueocean
镜像无法通过./node
来运行(Ubuntu
/Debian
可以)。因此怀疑jenkinsci/blueocean
镜像的shell无法运行Node
支持程序。 - ash视乎无法识别Node二进制文件(执行程序)的路径:node.js - 在 Jenkins docker 实例上找不到 Node - IT工具网 (coder.work)。因此,我参考文章Understanding /etc/passwd File Format - nixCraft (cyberciti.biz),尝试在
Alpine Linux
系统中安装bash,但是还是不行。
至此,我只能怀疑是jenkinsci/blueocean
镜像采用的Alpine Linux
系统的问题。按理来说,Alpine Linux
系统是可以安装使用NodeJS的,由于我只是使用过Ubuntu,所以不能确定。所以大概率是jenkinsci/blueocean
镜像封装Alpine Linux
系统时本身的BUG。
最后
目前,通过替换Jenkins Docker的镜像可以避免env node No such file or directory
问题。但是为什么jenkinsci/blueocean
会出现这个问题,我并没有定位到。期待大佬们的解惑。