I'm trying to install node canvas (https://github.com/Automattic/node-canvas) on Alpine within docker.
These are (parts of) my 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
When I try to boot my docker container the following error appears:
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)
I'm guessing that it has something to do with the fact that Alpine uses musl instead of glibc but I thought that rebuilding canvas from source npm rebuild canvas --build-from-source
would be enough.
I've already tried most suggestions from https://github.com/Automattic/node-canvas/issues but none is working for me.
Any suggestions ?
node:<version>-alpine This image is based on the popular Alpine Linux project, available in the alpine official image.
If you have "only" alpine images on your docker environment, then you should go with "alpine" or if the security of the "node" containers are really important to you. In most cases the "node" images based on "buildpack-deps" are suitable, since you have other docker containers based on "buildpack-deps".
No, it doesn't come with npm. You'd want to use one of the node images such as github.com/nodejs/docker-node/blob/… which has an alpine base image but comes with npm.
OK, here's an answer--a way to install node-canvas v2.5 under the official node:10.16.0-alpine Docker image. As you probably know, the error you posted, "Error relocating...canvas.node" indicates your build failed. This is because canvas uses glibc but alpine uses musl. Canvas needs to link to glibc, so you need to add it to your image. Sasha Gerrand offers alpine-pkg-glibc as one way to do it. Using his installation instructions, here's how it looks in a docker file:
# 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 [email protected]
;
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 . .
This worked for me. The additional packages are dependencies for sodium native.
I ran into the same error installing [email protected] on docker base with alpine and nodev8.9.4. I was able to fix it by upgrading to nodev10.15.0 and alpinev3.10. It works without having to install the alpine-pkg-glibc package. Ofcourse, you'll still have to install these packages:
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 [email protected]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With