gpt4 book ai didi

node.js - 带有 jenkins 插件的 Nodejs 在 alpine 图像中无法执行并显示 "symbol not found"

转载 作者:行者123 更新时间:2023-12-02 18:13:27 33 4
gpt4 key购买 nike

背景:

我们安装了 Node 版本 8,并且在基于 Jenkins alpine 的 docker 镜像(在 AWS ECS 中运行)中运行良好。 Node 8 安装在 jenkins-alpine docker 镜像中。

然后,需要安装node js Jenkins插件,以便可以使用全局工具配置根据需要安装和应用自定义版本,我们安装了nodejs 10,如下图所示: Node JS jenkins plugin

Nodejs 插件无法在 jenkins 中运行

然后我尝试在 jenkins 管道中使用 jenkins nodejs 10 插件,如下所示:

#!groovy​

pipeline {
options {
buildDiscarder(logRotator(daysToKeepStr: '5'))
timeout(time: 5, unit: 'MINUTES')
ansiColor('xterm')
}
agent {
label 'jenkins-slave'
}
stages {
stage('Nodejs test') {
steps {
nodejs('NodeJS 10.19.0') {
sh "which node; which npm"
sh "ls -l /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node"
sh "node -v"
}
}
}
}
}
}

jenkins 作业失败,因为它无法找到 Node ,即使它确实存在并且可以执行:

11:00:31  + which node
11:00:31 /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node
11:00:31 + which npm
11:00:31 /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/npm
[Pipeline] sh
11:00:31 + ls -l /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node
11:00:31 -rwxrwxr-x 1 jenkins jenkins 41122344 Feb 5 23:36 /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node

11:00:32 + /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node -v
11:00:32 /var/jenkins_home/workspace/test-jerald-nodejs-plugin@tmp/durable-55482f4f/script.sh: line 1: /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: not found

jenkins slave docker 容器内的测试

我尝试直接在 jenkins slave docker 容器中执行 node version 命令,但是,输出是相同的。然后我用谷歌搜索并引用了以下线程,其中提到这是因为 nodejs 缺少所需的库。 Jenkins NodeJSPlugin node command not found

以下是从 jenkins 插件中找到 nodejs 的共享库的初始输出

bash-4.4$ ldd /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node
/lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7fcbe2d29000)
libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7fcbe2d15000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fcbe2e7e000)
Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node)
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: gnu_get_libc_version: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: __register_atfork: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: setcontext: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: makecontext: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: backtrace: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: getcontext: symbol not found

然后我使用以下命令安装了缺少的库:

apk add libc6-compat gcompat

安装缺少的库后,没有与缺少的库相关的错误,但是仍然出现“找不到符号”的错误,并且 Node 仍然无法执行。

bash-4.4# ldd /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node
/lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7f0e697a1000)
libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f0e6978d000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f0e698f6000)
ld-linux-x86-64.so.2 => /lib/ld-linux-x86-64.so.2 (0x7f0e69787000)
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: gnu_get_libc_version: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: __register_atfork: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: setcontext: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: makecontext: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: backtrace: symbol not found
Error relocating /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_10.19.0/bin/node: getcontext: symbol not found
bash-4.4#

我还检查了现有 Node v8 的共享库,它没有问题:

bash-4.4# which node
/usr/local/bin/node
bash-4.4# ldd /usr/local/bin/node
/lib/ld-musl-x86_64.so.1 (0x7f1e07118000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7f1e0539f000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f1e0538b000)
libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7f1e07118000)

bash-4.4# /usr/local/bin/node -v
v8.11.3

那么任何人都可以帮助我让 Jenkins nodejs 插件工作吗?

最佳答案

使用 Jenkins GUI,您已经安装了“主流”Linux NodeJS 插件。从上面的输出可以清楚地看出,这个插件不兼容 Alpine Linux。

Alpine Linux 基于 musl-libc - musl 标准 C 库,因为大多数 Linux 发行版都是围绕 glibc 构建的- GNU 的标准 C 库。 libc 库为任何 native Linux 程序(包括标准 C 和 POSIX API)提供基本设施,并且是操作系统的固有部分。因此,构建在具有不同 libc 实现的不同操作系统上的二进制文件,例如 Alpine 的 musl 和 Debian 的 glibc,通常不会混合使用,因为这些实现并不完全兼容。

您提到的缺失库,libc6-compatgcompat ,在 Alpine 的 musl 周围添加一个 glibc 兼容层,它允许运行 simple glibc 程序。但是,它不提供所有 glibc API - 因此缺少符号。

对于 Alpine 上的 nodejs,您通常应该安装 Alpine 存储库的 nodejs 包,但遗憾的是它不提供 Jenkins 插件。您将需要一个 musl libc compatible nodeJS Jenkins 插件 - 我不确定是否可用。

有几种选择:

  1. 您可以通过在您的 Alpine 容器 (example) 上安装适当的 glibc 在 Alpine Linux 上使用“完整 glibc”。但是,这将需要重构您当前的图像,并且您会失去 Alpine 图像的“纯度”。
  2. 如果找不到兼容 musl 的插件,请考虑切换到(较少)紧凑、兼容 glibc 的基础镜像,例如 debian
  3. 或者,尝试在 Alpine Linux 上从源代码构建 Jenkins 插件,然后手动安装。

关于node.js - 带有 jenkins 插件的 Nodejs 在 alpine 图像中无法执行并显示 "symbol not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60539480/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com