我想创建一个 Docker 镜像来做两件简单的事情:
- 拉
node:14-alpine
- 更新至最新的 Node.js 次要版本
我读过这两篇文章,它们在 Alpine Linux 上n
都nvm
存在问题。那么,最好的解决方法是什么?
(背景:在撰写本文时,node:14-alpine
是14.17.1
,而最新的 Node.js 小版本 14 是14.17.3
。因此,获取最新版本而不必等待正式发布是有意义的。)
答案1
在撰写本文时,14.17.3
它已经发布。所以我想最简单的答案是等待几天是你能做的最实际的事情。甚至可能需要重新拉取node:14-alpine
才能获得更新的图像。
但如果你真的想知道需要做什么,你可以查看每个官方 Docker 镜像的 Dockerfile。对于你的node:14-alpine
镜像,它位于此处:https://github.com/nodejs/docker-node/blob/main/14/alpine3.14/Dockerfile
从第 19 行开始,你会看到以下内容:
ENV NODE_VERSION 14.17.3 # line 3
# snip
set -eu; \
curl -fsSLO --compressed "https://unofficial-builds.nodejs.org/download/release/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz"; \
echo "$CHECKSUM node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz" | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs;
这就是他们安装节点二进制发行版时所做的(尽管从第 26 行开始您可以看到自己编译所有内容)。不过,验证 sha256 校验和是可选的。
因此,您可以执行相同的操作并像这样覆盖 Alpine 容器内的节点版本。
编辑:如果您不喜欢对版本进行硬编码,您可以使用 curl 和 jq(需要安装)来自动化执行:
# Install jq and curl dependencies
apk add --no-cache jq curl
# Get major.minor version (that is v14.xx for node:14-alpine)
export NODE_MAJOR_MINOR_VERSION=$(node --version | cut -d. -f1,2)
# Dynamically receive the newest version for the major version of this image
export DOWNLOAD_VERSION=$(curl -fsSL --compressed https://unofficial-builds.nodejs.org/download/release/index.json | jq --raw-output ".[]|select(.version | startswith(\"$NODE_MAJOR_MINOR_VERSION\"))|.version" | head -1)
# Download the suitable tarball
curl -fsSLO --compressed "https://unofficial-builds.nodejs.org/download/release/$DOWNLOAD_VERSION/node-$DOWNLOAD_VERSION-linux-x64-musl.tar.xz"
# Uncompress the tarball
tar -xJf "node-$DOWNLOAD_VERSION-linux-x64-musl.tar.xz" -C /usr/local --strip-components=1 --no-same-owner
# Overwrite symlink node -> nodejs
ln -sf /usr/local/bin/node /usr/local/bin/nodejs