【问题标题】:node canvas on alpine within dockerdocker内高山上的节点画布
【发布时间】:2019-11-27 00:26:21
【问题描述】:

我正在尝试在 docker 内的 Alpine 上安装节点画布 (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 重建画布就足够了。

我已经尝试了来自https://github.com/Automattic/node-canvas/issues 的大多数建议,但没有一个对我有用。

有什么建议吗?

【问题讨论】:

    标签: docker alpine node-canvas


    【解决方案1】:

    好的,这是一个答案——在官方 node:10.16.0-alpine Docker 镜像下安装 node-canvas v2.5 的方法。您可能知道,您发布的错误“错误重定位...canvas.node”表示您的构建失败。这是因为 canvas 使用 glibc 而 alpine 使用 musl。 Canvas 需要链接到 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
            ;
    

    【讨论】:

    • 感谢您的回答。然而,我确实切换到了 debian-slim 作为我们的 docker 镜像。我们遇到了一些其他问题,迫使我们切换图像。但是,我会接受您的回答 :) 看起来这是解决方案。
    • 我在构建过程中遇到了一些错误,但在运行我的应用程序时似乎很好
    【解决方案2】:
    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 . .
    

    这对我有用。额外的包是钠原生的依赖项。

    【讨论】:

    • 我用过这个解决方案,效果很好!
    • 很高兴为您提供帮助?@HugoSohm
    【解决方案3】:

    我在使用 alpine 和 nodev8.9.4 的 docker base 上安装 canvas@2.6.0 时遇到了同样的错误。我可以通过升级到 nodev10.15.0alpinev3.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:14.15.1-alpine
    【解决方案4】:

    这不是一个答案——抱歉——但您可能需要解决方法,直到问题得到解决。我已暂时备份到 node:8.1.0-alpine 映像。在这张图片下,我可以 npm install canvas@1.6.7。它引发了大量警告,但我得到了一个可以部署的工作图像。现在我希望有人能找到这个问题的真正答案,我们可以让 canvas 2.5 在 node:10.16.0-alpine 下运行。希望对您有所帮助。

    【讨论】:

      【解决方案5】:

      “重建”也不适用于我。但是这个修改会,你可以试试(请忽略我其他库的一些其他包)

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-20
        相关资源
        最近更新 更多