使用基于 alpine 镜像构建的容器安装 nodejs 失败

环境

  • OS: manjaro 20.0.3
  • Docker: 19.03.11-ce

遇到的问题

我使用Nodejs官方的源码包安装Nodejs。也就是将官网下载的tar格式的包解压后,再链接二进制文件的方式。

但是发生了一个问题:我将源码包里边的node可执行文件链接到/usr/sbin/node后,执行node -v,提示command not found


原因

几经查找,发现原来是因为Nodejs官网提供的源码包是使用glibc库打包的,而Alpine使用的是musl


解决方案

  1. 使用Alpine自带的apk进行安装: apk add nodejs npm
  2. 使用非官方构建源里边的包,里边有musl版本的:https://unofficial-builds.nodejs.org/download/release/ 。虽说是非官方构建源,也是官网上提供的链接。

反思

之前也看到过Alpine关于编译库的坑,但是没想到这么快就让我遇上了,而且的确容易被command not found这个提示误导,这使我一度怀疑dash$PATHln。调试过程中,我开始反思:为什么放着好好的debian不用非要用这个?然后看了下我那个打包完的镜像,就那个1.5G的镜像,唉~


题外话

最近接手的一个项目用的是传统的人工 + 智能的方式部署的web环境。部署过程一言难尽,于是我便有了上docker的念头。web应用的包主要包含
1. ruby
2. node
3. rails
4. apache
5. passenger

一开始使用的是基于busterbuster基于debian)的ruby镜像,打包完的镜像大小有1.5G,把我吓了一跳。这还是在尽可能的减少分层和删除依赖得到的结果。网上找了下,比较有效的方法也就是用小一点的镜像了。于是便用了Alpine,最终得到的包的大小为640M,也算是还能接受吧。

点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注