【问题标题】:Install node.js from source on alpine在 alpine 上从源代码安装 node.js
【发布时间】:2021-01-22 09:19:56
【问题描述】:

我正在尝试在 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 上执行相同操作时,它可以工作。

【问题讨论】:

    标签: node.js docker alpine


    【解决方案1】:

    这是因为 alpine 使用 musl 而不是 glibc,并且从节点网站分发的二进制文件是针对 glibc 构建的。

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

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

    2. 通过apk 安装节点: 节点在 alpine 的官方包管理器 apk 中提供,您只需运行 apk add nodejs 即可安装它。这里唯一的问题是存储库中可用的版本是 LTS(截至 2020 年 10 月 7 日为 12.18.4)。

    3. 在 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
    

    坚持节点的官方形象(解决方案1),事情应该会很好:)

    【讨论】:

      【解决方案2】:

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

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

      注意:非官方版本在Node.js project 中链接,那么在我看来并不代表安全问题。

      【讨论】:

      • 使用硬编码的平台构建(本例中为 x64)会失去对不同平台(例如 M1 mac)的支持。
      【解决方案3】:

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

      【讨论】:

      • 尝试包含 Dockerfile 的内容和对它的引用,因为存储库可能会更改/关闭。
      猜你喜欢
      • 1970-01-01
      • 2015-09-14
      • 2020-10-12
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多