如何在基于ruby:3.0.1-alpine3.13镜像的Dockerfile中设置Node版本为16.x
原因分析
你使用的ruby:3.0.1-alpine3.13基础镜像对应的Alpine 3.13版本,官方软件源中默认提供的nodejs包就是14.x版本,因此直接执行apk add nodejs只能安装14.x版本,无法满足16.x的引擎要求。你之前用nvm、n工具安装失败的核心原因是Alpine使用musl libc作为系统库,而nvm、n默认提供的Node.js二进制包是基于glibc编译的,在Alpine环境下无法正常运行。
解决方案1:安装官方预编译的Alpine适配版Node.js 16(推荐)
该方案兼容性好,同时支持x86_64和M1芯片的aarch64架构,版本可控,修改Dockerfile对应部分即可:
- 先删掉原有依赖安装步骤里的
nodejs、npm两项 - 新增独立的Node.js 16安装步骤
修改后的相关代码段如下:
# 为M1芯片Mac安装依赖 RUN apk add --update --no-cache curl py-pip python2 python3 wget # 安装应用依赖(移除原有nodejs、npm) RUN apk -U add --no-cache \ make \ gcc \ build-base \ git \ postgresql-dev \ postgresql-client \ libxml2-dev \ libxslt-dev \ yarn \ tzdata \ && rm -rf /var/cache/apk/* \ && mkdir -p $APP_PATH # 安装指定版本Node.js 16.x ENV NODE_VERSION 16.20.2 RUN ARCH= && alpineArch="$(apk --print-arch)" \ && case "${alpineArch##*-}" in \ x86_64) ARCH='x64';; \ aarch64) ARCH='arm64';; \ *) echo "unsupported architecture: $alpineArch"; exit 1;; \ esac \ && wget -O node.tar.xz "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${ARCH}.tar.xz" \ && tar -xf node.tar.xz -C /usr/local --strip-components=1 --no-same-owner \ && rm node.tar.xz \ && ln -s /usr/local/bin/node /usr/local/bin/nodejs
解决方案2:通过Alpine社区源安装(更简便)
如果不需要严格锁定Node.js小版本,可以直接添加高版本Alpine的社区源安装nodejs16,在原有依赖安装步骤前新增如下代码即可:
# 添加Alpine 3.16社区源,安装Node.js 16 RUN echo "http://dl-cdn.alpinelinux.org/alpine/v3.16/community" >> /etc/apk/repositories \ && apk add --no-cache nodejs=16.* npm=8.*
内容的提问来源于stack exchange,提问作者Ghouse Mohamed
相关产品推荐
相关产品推荐

