docker 内的高山节点 canvas
node canvas on alpine within docker
我正在尝试在 docker.
内在 Alpine 上安装节点 canvas (https://github.com/Automattic/node-canvas)
这些是我的 Dockerfile(的一部分):
# Use node/alpine image for final build
FROM keymetrics/pm2:latest-alpine as app
# install dependencies for canvas
RUN apk --no-cache --virtual .build-deps add \
python \
make \
g++ \
gcc \
&& apk --no-cache --virtual .canvas-build-deps add \
build-base \
cairo-dev \
jpeg-dev \
pango-dev \
giflib-dev \
pixman-dev \
pangomm-dev \
libjpeg-turbo-dev \
freetype-dev \
&& apk --no-cache add \
pixman \
cairo \
pango \
giflib
RUN apk add --update --repository http://dl-3.alpinelinux.org/alpine/edge/testing libmount ttf-dejavu ttf-droid ttf-freefont ttf-liberation ttf-ubuntu-font-family fontconfig
# Install dependencies
RUN npm install --prod
RUN npm rebuild canvas --build-from-source
当我尝试启动我的 docker 容器时出现以下错误:
Error: Error relocating /var/www/app/node_modules/canvas/build/Release/canvas.node: FcConfigGetCurrent: symbol not found
at Object.Module._extensions..node (internal/modules/cjs/loader.js:775:18)
at Module.load (internal/modules/cjs/loader.js:626:32)
at tryModuleLoad (internal/modules/cjs/loader.js:566:12)
at Function.Module._load (internal/modules/cjs/loader.js:558:3)
at Module.require (internal/modules/cjs/loader.js:663:17)
at require (internal/modules/cjs/helpers.js:20:18)
at Object.<anonymous> (/var/www/app/node_modules/canvas/lib/bindings.js:3:18)
at Module._compile (internal/modules/cjs/loader.js:734:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:745:10)
at Module.load (internal/modules/cjs/loader.js:626:32)
at tryModuleLoad (internal/modules/cjs/loader.js:566:12)
at Function.Module._load (internal/modules/cjs/loader.js:558:3)
at Module.require (internal/modules/cjs/loader.js:663:17)
at require (internal/modules/cjs/helpers.js:20:18)
at Object.<anonymous> (/var/www/app/node_modules/canvas/lib/canvas.js:9:18)
at Module._compile (internal/modules/cjs/loader.js:734:30)
我猜这与 Alpine 使用 musl 而不是 glibc 这一事实有关,但我认为从源 npm rebuild canvas --build-from-source
重建 canvas 就足够了。
我已经尝试了 https://github.com/Automattic/node-canvas/issues 的大部分建议,但 none 对我有用。
有什么建议吗?
这不是答案——抱歉——但在问题得到解决之前,您可能需要解决方法。我暂时备份到了node:8.1.0-alpine镜像。在这张图片下,我可以 npm install canvas@1.6.7。它抛出了大量警告,但我得到了一个可以部署的工作图像。现在我希望有人能找到这个问题的真正答案,我们可以在 node:10.16.0-alpine 下得到 canvas 2.5 运行。希望对你有帮助。
"rebuild" 也不适用于我。但是这个修改会,你可以试试(请忽略我的一些其他库的其他包)
FROM node:8.16.0-alpine
....
RUN apk --update --no-cache --virtual build-dependencies add \
python python-dev py-pip \
build-base make g++ pkgconfig autoconf automake bash \
imagemagick cairo-dev jpeg-dev pango-dev giflib-dev pixman-dev pangomm-dev libjpeg-turbo-dev freetype-dev \
libc6-compat \
&& apk --no-cache add \
pixman cairo pango giflib libjpeg \
....
# Remove the canvas in package.json
RUN npm install canvas@2.0.0-alpha.12 --build-from-source
RUN npm install --prod
OK,给个答案——官方node:10.16.0-下安装node-canvasv2.5的方法高山 Docker 图片。您可能知道,您发布的错误 "Error relocating...canvas.node" 表示您的构建失败。这是因为 canvas 使用 glibc 而 alpine 使用 musl。 Canvas 需要 link 到 glibc,因此您需要将其添加到您的映像中。 Sasha Gerrand 提供 alpine-pkg-glibc 作为一种方法。使用他的安装说明,下面是它在 docker 文件中的样子:
# geo_core layer
# build on a node image, in turn built on alpine linux, Docker's official linux pulled from hub.docker.com
FROM node:10.16.0-alpine
# add libraries; sudo so non-root user added downstream can get sudo
RUN apk add --no-cache \
sudo \
curl \
build-base \
g++ \
libpng \
libpng-dev \
jpeg-dev \
pango-dev \
cairo-dev \
giflib-dev \
python \
;
# add glibc and install canvas
RUN apk --no-cache add ca-certificates wget && \
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub && \
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk && \
apk add glibc-2.29-r0.apk && \
npm install canvas@2.5.0
;
我 运行 在使用 alpine 和 nodev8.9.4 在 docker base 上安装 canvas@2.6.0 时遇到同样的错误。我能够通过升级到 nodev10.15.0 和 alpinev3.10 来修复它。它无需安装 alpine-pkg-glibc 包即可工作。当然,您仍然需要安装这些软件包:
apk add --no-cache \
python \
g++ \
build-base \
cairo-dev \
jpeg-dev \
pango-dev \
musl-dev \
giflib-dev \
pixman-dev \
pangomm-dev \
libjpeg-turbo-dev \
freetype-dev \
&& npm install canvas@2.6.0
FROM node:12-alpine
WORKDIR /app
RUN apk add --update --no-cache \
make \
g++ \
jpeg-dev \
cairo-dev \
giflib-dev \
pango-dev \
libtool \
autoconf \
automake
COPY package.json ./
RUN npm install
COPY . .
这对我有用。附加包是 sodium native 的依赖项。
我正在尝试在 docker.
内在 Alpine 上安装节点 canvas (https://github.com/Automattic/node-canvas)这些是我的 Dockerfile(的一部分):
# Use node/alpine image for final build
FROM keymetrics/pm2:latest-alpine as app
# install dependencies for canvas
RUN apk --no-cache --virtual .build-deps add \
python \
make \
g++ \
gcc \
&& apk --no-cache --virtual .canvas-build-deps add \
build-base \
cairo-dev \
jpeg-dev \
pango-dev \
giflib-dev \
pixman-dev \
pangomm-dev \
libjpeg-turbo-dev \
freetype-dev \
&& apk --no-cache add \
pixman \
cairo \
pango \
giflib
RUN apk add --update --repository http://dl-3.alpinelinux.org/alpine/edge/testing libmount ttf-dejavu ttf-droid ttf-freefont ttf-liberation ttf-ubuntu-font-family fontconfig
# Install dependencies
RUN npm install --prod
RUN npm rebuild canvas --build-from-source
当我尝试启动我的 docker 容器时出现以下错误:
Error: Error relocating /var/www/app/node_modules/canvas/build/Release/canvas.node: FcConfigGetCurrent: symbol not found
at Object.Module._extensions..node (internal/modules/cjs/loader.js:775:18)
at Module.load (internal/modules/cjs/loader.js:626:32)
at tryModuleLoad (internal/modules/cjs/loader.js:566:12)
at Function.Module._load (internal/modules/cjs/loader.js:558:3)
at Module.require (internal/modules/cjs/loader.js:663:17)
at require (internal/modules/cjs/helpers.js:20:18)
at Object.<anonymous> (/var/www/app/node_modules/canvas/lib/bindings.js:3:18)
at Module._compile (internal/modules/cjs/loader.js:734:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:745:10)
at Module.load (internal/modules/cjs/loader.js:626:32)
at tryModuleLoad (internal/modules/cjs/loader.js:566:12)
at Function.Module._load (internal/modules/cjs/loader.js:558:3)
at Module.require (internal/modules/cjs/loader.js:663:17)
at require (internal/modules/cjs/helpers.js:20:18)
at Object.<anonymous> (/var/www/app/node_modules/canvas/lib/canvas.js:9:18)
at Module._compile (internal/modules/cjs/loader.js:734:30)
我猜这与 Alpine 使用 musl 而不是 glibc 这一事实有关,但我认为从源 npm rebuild canvas --build-from-source
重建 canvas 就足够了。
我已经尝试了 https://github.com/Automattic/node-canvas/issues 的大部分建议,但 none 对我有用。
有什么建议吗?
这不是答案——抱歉——但在问题得到解决之前,您可能需要解决方法。我暂时备份到了node:8.1.0-alpine镜像。在这张图片下,我可以 npm install canvas@1.6.7。它抛出了大量警告,但我得到了一个可以部署的工作图像。现在我希望有人能找到这个问题的真正答案,我们可以在 node:10.16.0-alpine 下得到 canvas 2.5 运行。希望对你有帮助。
"rebuild" 也不适用于我。但是这个修改会,你可以试试(请忽略我的一些其他库的其他包)
FROM node:8.16.0-alpine
....
RUN apk --update --no-cache --virtual build-dependencies add \
python python-dev py-pip \
build-base make g++ pkgconfig autoconf automake bash \
imagemagick cairo-dev jpeg-dev pango-dev giflib-dev pixman-dev pangomm-dev libjpeg-turbo-dev freetype-dev \
libc6-compat \
&& apk --no-cache add \
pixman cairo pango giflib libjpeg \
....
# Remove the canvas in package.json
RUN npm install canvas@2.0.0-alpha.12 --build-from-source
RUN npm install --prod
OK,给个答案——官方node:10.16.0-下安装node-canvasv2.5的方法高山 Docker 图片。您可能知道,您发布的错误 "Error relocating...canvas.node" 表示您的构建失败。这是因为 canvas 使用 glibc 而 alpine 使用 musl。 Canvas 需要 link 到 glibc,因此您需要将其添加到您的映像中。 Sasha Gerrand 提供 alpine-pkg-glibc 作为一种方法。使用他的安装说明,下面是它在 docker 文件中的样子:
# geo_core layer
# build on a node image, in turn built on alpine linux, Docker's official linux pulled from hub.docker.com
FROM node:10.16.0-alpine
# add libraries; sudo so non-root user added downstream can get sudo
RUN apk add --no-cache \
sudo \
curl \
build-base \
g++ \
libpng \
libpng-dev \
jpeg-dev \
pango-dev \
cairo-dev \
giflib-dev \
python \
;
# add glibc and install canvas
RUN apk --no-cache add ca-certificates wget && \
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub && \
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk && \
apk add glibc-2.29-r0.apk && \
npm install canvas@2.5.0
;
我 运行 在使用 alpine 和 nodev8.9.4 在 docker base 上安装 canvas@2.6.0 时遇到同样的错误。我能够通过升级到 nodev10.15.0 和 alpinev3.10 来修复它。它无需安装 alpine-pkg-glibc 包即可工作。当然,您仍然需要安装这些软件包:
apk add --no-cache \
python \
g++ \
build-base \
cairo-dev \
jpeg-dev \
pango-dev \
musl-dev \
giflib-dev \
pixman-dev \
pangomm-dev \
libjpeg-turbo-dev \
freetype-dev \
&& npm install canvas@2.6.0
FROM node:12-alpine
WORKDIR /app
RUN apk add --update --no-cache \
make \
g++ \
jpeg-dev \
cairo-dev \
giflib-dev \
pango-dev \
libtool \
autoconf \
automake
COPY package.json ./
RUN npm install
COPY . .
这对我有用。附加包是 sodium native 的依赖项。