Docker 内 Alpine Linux 上的 Node.js:更新至最新次要版本

Docker 内 Alpine Linux 上的 Node.js:更新至最新次要版本

我想创建一个 Docker 镜像来做两件简单的事情:

  • node:14-alpine
  • 更新至最新的 Node.js 次要版本

我读过这两篇文章,它们在 Alpine Linux 上nnvm存在问题。那么,最好的解决方法是什么?

(背景:在撰写本文时,node:14-alpine14.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

相关内容