在 alpine 上从源安装 node.js

Install node.js from source on alpine

我正在尝试在 alpine docker 上从源安装节点。

wget https://nodejs.org/dist/v14.4.0/node-v14.4.0-linux-x64.tar.xz

tar -xvf node-v14.4.0-linux-x64.tar.xz 一旦我尝试 运行 它:

~/node-v14.4.0-linux-x64/bin # ./node 
sh: ./node: not found

虽然文件在这里,但我有权限,可以执行

~/node-v14.4.0-linux-x64/bin # ls -la
total 70376
drwxr-xr-x 2 root root     4096 Oct  7 11:53 .
drwxr-xr-x 6 1001 1001     4096 Oct  7 11:53 ..
-rwxr-xr-x 1 root root 72052312 Jun  2 14:33 node
lrwxrwxrwx 1 root root       38 Oct  7 11:53 npm -> ../lib/node_modules/npm/bin/npm-cli.js
lrwxrwxrwx 1 root root       38 Oct  7 11:53 npx -> ../lib/node_modules/npm/bin/npx-cli.js

当我对 ubuntu 执行相同的操作时,它起作用了。

其他二进制文件不能在 alpine 上运行,需要像这里一样手动构建它 https://github.com/nodejs/docker-node/blob/80ded64083b5c9be7853d9d3634a22a96e15e92d/14/alpine3.10/Dockerfile

发生这种情况是因为 alpine 使用 musl 而不是 glibc,并且从节点网站分发的二进制文件是针对 glibc.

构建的

以下是针对您的问题的一些解决方案,按优先顺序排列(以及原因):

  1. 使用 node's official image 而不是尝试从 alpine 基础映像安装它:那是因为在安装之前有不同的依赖项和设置工作节点映像(证书、tls 库等)。 这是最推荐的。

  2. Installing node via apk: node在alpine的官方包管理器apk中可用,你可以简单地安装它运行 apk add nodejs。这里唯一的问题是存储库中可用的版本是 LTS(截至 2020 年 10 月 7 日为 12.18.4)。

  3. Installing/building alpine 中 glibc 的兼容层: 根本不推荐这样做,因为 alpine 是建立在 musl 和 运行 glibc 不是一个好的做法,可能会导致事情中断 。即使安装官方libc6-compat也可能会出问题:

运行 节点使用 libc6-compat:

$ ./node
Error relocating ./node: gnu_get_libc_version: symbol not found
Error relocating ./node: __register_atfork: symbol not found
Error relocating ./node: __strdup: symbol not found
Error relocating ./node: setcontext: symbol not found
Error relocating ./node: makecontext: symbol not found
Error relocating ./node: backtrace: symbol not found
Error relocating ./node: getcontext: symbol not found

运行 节点使用 this answer's 建议 glibc:

$ ./node
./node: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

坚持使用 node 的官方图像(解决方案 1),一切都会好起来的:)

您需要下载针对 musl 构建的非官方版本

wget https://unofficial-builds.nodejs.org/download/release/v14.4.0/node-v14.4.0-linux-x64-musl.tar.xz

注意:非官方版本在 Node.js project 中链接,然后从我的角度来看并不代表安全问题。