nodejs / docker-node

Official Docker Image for Node.js :whale: :turtle: :rocket:
https://hub.docker.com/_/node/
MIT License
8.24k stars 1.97k forks source link

node:18-alpine build failing for canvas install #2086

Open sabreu-teknorix opened 4 months ago

sabreu-teknorix commented 4 months ago

Environment

Expected Behavior

build should not fail

Current Behavior

Build failing with stack trace

.../canvas@2.11.2/node_modules/canvas install: Traceback (most recent call last): .../canvas@2.11.2/node_modules/canvas install: File "/root/.cache/node/corepack/v1/pnpm/8.15.7/dist/node_modules/node-gyp/gyp/gyp_main.py", line 42, in .../canvas@2.11.2/node_modules/canvas install: import gyp # noqa: E402 .../canvas@2.11.2/node_modules/canvas install: ^^^^^^^^^^ .../canvas@2.11.2/node_modules/canvas install: File "/root/.cache/node/corepack/v1/pnpm/8.15.7/dist/node_modules/node-gyp/gyp/pylib/gyp/init.py", line 9, in .../canvas@2.11.2/node_modules/canvas install: import gyp.input .../canvas@2.11.2/node_modules/canvas install: File "/root/.cache/node/corepack/v1/pnpm/8.15.7/dist/node_modules/node-gyp/gyp/pylib/gyp/input.py", line 19, in .../canvas@2.11.2/node_modules/canvas install: from distutils.version import StrictVersion .../canvas@2.11.2/node_modules/canvas install: ModuleNotFoundError: No module named 'distutils' .../canvas@2.11.2/node_modules/canvas install: gyp ERR! configure error .../canvas@2.11.2/node_modules/canvas install: gyp ERR! stack Error: gyp failed with exit code: 1 .../canvas@2.11.2/node_modules/canvas install: gyp ERR! stack at ChildProcess.onCpExit (/root/.cache/node/corepack/v1/pnpm/8.15.7/dist/node_modules/node-gyp/lib/configure.js:325:16) .../canvas@2.11.2/node_modules/canvas install: gyp ERR! stack at ChildProcess.emit (node:events:517:28) .../canvas@2.11.2/node_modules/canvas install: gyp ERR! stack at ChildProcess._handle.onexit (node:internal/child_process:292:12) .../canvas@2.11.2/node_modules/canvas install: gyp ERR! System Linux 5.15.0-1058-aws .../canvas@2.11.2/node_modules/canvas install: gyp ERR! command "/usr/local/bin/node" "/root/.cache/node/corepack/v1/pnpm/8.15.7/dist/node_modules/node-gyp/bin/node-gyp.js" "configure" "--fallback-to-build" "--update-binary" "--module=/app/node_modules/.pnpm/canvas@2.11.2/node_modules/canvas/build/Release/canvas.node" "--module_name=canvas" "--module_path=/app/node_modules/.pnpm/canvas@2.11.2/node_modules/canvas/build/Release" "--napi_version=9" "--node_abi_napi=napi" "--napi_build_version=0" "--node_napi_label=node-v108" .../canvas@2.11.2/node_modules/canvas install: gyp ERR! cwd /app/node_modules/.pnpm/canvas@2.11.2/node_modules/canvas .../canvas@2.11.2/node_modules/canvas install: gyp ERR! node -v v18.20.3 .../canvas@2.11.2/node_modules/canvas install: gyp ERR! node-gyp -v v9.4.1 .../canvas@2.11.2/node_modules/canvas install: gyp ERR! not ok

Possible Solution

Steps to Reproduce

Additional Information

LaurentGoderre commented 4 months ago

Your issue is a combination of https://github.com/Automattic/node-canvas/issues/2158 and https://github.com/Automattic/node-canvas/issues/1065.

The following works

FROM node:18-alpine

WORKDIR /home/node

RUN set -ex; \
    apk add --no-cache --virtual .gyp \
        # Gyp build dependencies
        python3 make g++ \
        # Canvas build dependencies
        pixman-dev cairo-dev pango-dev pkgconfig; \
    npm install canvas; \
    apk del .gyp
maxime-gd commented 4 months ago

This solution didn't work for me but I found a way to get it to work. Docker updated Alpine yesterday and reverse my dockerfile to the previous one worked : lts-alpine3.19 for Node 20 or 18-alpine3.19 for Node 18.

LaurentGoderre commented 4 months ago

@maxime-gd what error do you have? It worked for me for both alpine 3.19 and 3.20

alex-statsig commented 4 months ago

Ran into the same distutils issue in a different project, had to revert to alpine3.19 to fix.

I think maybe the python version was updated in alpine3.20 (to 3.12) and thus distutils is no longer available by default, so something like pip3 install setuptools would be required to fix. Haven't gotten this working fully yet though.

maxime-gd commented 4 months ago

The same one as @sabreu-teknorix and @alex-statsig : distutils missing.

SystemParadox commented 3 months ago

The issue is this: https://github.com/nodejs/node-gyp/issues/2869 and affects node:20-alpine and probably others as well. This is not just a canvas issue, it affects all node-gyp builds.

apk add py-setuptools appears to fix it.

LaurentGoderre commented 3 months ago

Maybe we need to append the docs about building native deps to document this

LaurentGoderre commented 3 months ago

PR to update the docs: #2099