在不从源代码构建的情况下在 Alpine 上固定 nodejs 版本

Pin nodejs version on Alpine without building from source

我正在尝试在 Docker 上安装 Kibana 6.7.0。基础继承 FROM behance/docker-nginx:8.5-alpine Kibana 抛出一个错误,指出它需要节点版本 10.15.2 因为 alpine 默认提供来自 apk 仓库的 10.16.0

我试过像这样固定节点版本

curl -O https://nodejs.org/download/release/v10.15.2/node-v10.15.2-linux-x64.tar.gz
tar xzf node-v10.15.2-linux-x64.tar.gz

ENV PATH="/node-v10.15.2-linux-x64/bin:${PATH}"

当我做 node -v 我收到一条错误消息,指出节点 /node-v10.15.2-linux-x64/bin/node 未找到,即使它存在。

是否可以在不从源构建的情况下安装节点 10.15.2

不,你没有机会。

事实上虽然最新的alpine使用node10.16,见this, but your alpine version is v3.9, which use node10.14, see this。我不知道你是否可以使用 node10.14 让你工作,但你没有机会使用 apk add 安装 node10.15 版本,因为它们甚至没有存储在 apk 中央仓库中。

而且,从官方网站下载像 https://nodejs.org/download/release/v10.15.2/node-v10.15.2-linux-x64.tar.gz 这样的预构建包绝对不适合你。这是因为 alpine 使用 musl libc 而官方的 nodejs 二进制文件是用 glibc 构建的,这是 linux 世界中更常见的 libc。供你参考的类似讨论是 here.

因此,唯一的解决办法就是使用source来构建,可以参考this to add your things to your dockerfile. Additional, multi-stage builds在你的场景中是首选