使用node:16.15.1(alpine 3.16)将python2添加到Docker?

Knu*_*uth 1 node.js python-2.7 docker alpine-linux

我需要在 Vue 应用程序的 Dockerfile 中包含 python2,以便构建依赖项 node-sass@4.14.1 (在 package.json 中定义)。以下工作正常:

FROM node:16.15.0-alpine as builder 
RUN apk add --no-cache python2 make g++
...
ADD app/package.json .
RUN CXXFLAGS="--std=c++14" npm install
Run Code Online (Sandbox Code Playgroud)

但这个节点镜像使用的是 alpine 3.15,它在 zlib 中有一个我想删除的严重漏洞,所以我想使用更新的 alpine 版本。但是使用例如node:16.15.1-alpine(使用alpine-3.16)然后apk添加失败,因为python2不再包含在该图像中。

我尝试设置 PYTHON 环境变量并使用 python3 代替,但是 node-gyp@3.8.0 (由 node-sass@4.14.1 使用)的构建失败并出现 SyntaxError: Missing Parentheses in call to 'print',所以对于这个版本,似乎需要 python2 来构建。

在 package.json 中,我的 devDependency 是:

"devDependencies": {
...
 "node-sass": "^4.14.1",
 "sass-loader": "^7.0.1"
Run Code Online (Sandbox Code Playgroud)

(是的,我意识到node-sass版本很旧(就像python2一样),并且node-sass已被弃用,但尝试使用此包的较新版本会导致其他问题,所以我首先想尝试只需使构建适用于现有版本,但使用较新的 alpine。)

使用node:16.15.1-alpine作为基础镜像时如何添加python2?

Knu*_*uth 6

对于未来的读者 - 这不是关于如何添加 python2 的答案,而是关于我如何解决根本问题 - 失败的构建的答案:

需要 python2 来构建的包是node-gypnode-sass. 为了消除这种需要,我替换node-sasssass

npm uninstall node-sass
npm install sass
Run Code Online (Sandbox Code Playgroud)

由于 sass 不需要构建 python 或 g++,我可以将 Dockerfile 简化为

FROM node:16.15.1-alpine as builder
...
ADD app/package.json .
RUN npm install
...
Run Code Online (Sandbox Code Playgroud)

现在我可以将节点映像升级到 16.15.1 及更高版本,这正是我所需要的。

请仍然随意回答如何添加 python2,以防未来的读者可能仍然需要它。但为了解决构建问题,我的解决方案是更改包。