在macbook pro m1 max 上运行 nodejs 程序和docker 上碰到的问题和解决方案

#6 28.41 > canvas@2.9.1 install /usr/src/app/node_modules/canvas
#6 28.41 > node-pre-gyp install –fallback-to-build
#6 28.41
#6 28.89 node-pre-gyp ERR! install response status 404 Not Found on https://github.com/Automattic/node-canvas/releases/download/v2.9.1/canvas-v2.9.1-node-v83-linux-glibc-arm64.tar.gz
#6 28.90 node-pre-gyp WARN Pre-built binaries not installable for canvas@2.9.1 and node@14.17.0 (node-v83 ABI, glibc) (falling back to source compile with node-gyp)
#6 28.90 node-pre-gyp WARN Hit error response status 404 Not Found on https://github.com/Automattic/node-canvas/releases/download/v2.9.1/canvas-v2.9.1-node-v83-linux-glibc-arm64.tar.gz
#6 30.08 Package pangocairo was not found in the pkg-config search path.
#6 30.08 Perhaps you should add the directory containing `pangocairo.pc’
#6 30.08 to the PKG_CONFIG_PATH environment variable
#6 30.08 No package ‘pangocairo’ found
#6 30.08 gyp: Call to ‘pkg-config pangocairo –libs’ returned exit status 1 while in binding.gyp. while trying to load binding.gyp
#6 30.08 gyp ERR! configure error

在新买的Macbook pro M1 max 生成docker镜像时碰到的问题,觉得有必要写一篇博客,应该能帮助一些小伙伴少走些弯路。 解决问题的方法其实很简单,有时候只是要换一个方向。

我的一个NODEJS程序有一个 canvas 的依赖, 在生成 docker 镜像的时候,我在Dockerfile 里面定义了 npm install canvas 的指令, 会在生成的镜像里预安装 canvas 依赖。 但是这步出现了如上的问题。

FROM node:16.6.2
RUN echo build docker image based on node:16.6.2
RUN \
mkdir /usr/src/app && \
cd /usr/src/app && \
npm install pm2 -g && \
npm install canvas && \
npm install newrelic
WORKDIR /usr/src/app
COPY dist ./dist
COPY views ./views
COPY public ./public
EXPOSE 3000
CMD pm2 start -i 1 ./dist/main.ca14e8f1.js && pm2 log

这个问题的原因是ARM架构的M1 CPU引起的, 因为canvas  没有ARM架构的预编译包,所以安装不成功。 谷歌搜索后,找到官方的解决方案,就是自己从源码编译。。。我那个去!!!

自己下载源码编译可能得耗你一整天才能整明白。

但是!

我们真有有必要去这么做吗?不一定!

首先,来讲一下我在本机上建立docker镜像的用意,我需要建一个docker 镜像,然后可以推送到 heroku 发布我的应用,这是我的初衷。 那么, heroku 并不是使用ARM架构的CPU, 我在这里使这个劲干什么? 就算我编译成功了,那这个镜像也是不能在heroku 上使用,只能在我本机上使用, 那有什么意义! 所以, 从源码编译,不仅费力不讨好,还根本解决不了问题。

实际上,只要改动一行,我们就能解决这个问题

FROM –platform=linux/amd64 node:16.6.2
RUN echo build docker image based on node:16.6.2
RUN \
mkdir /usr/src/app && \
cd /usr/src/app && \
npm install pm2 -g && \
npm install canvas && \
npm install newrelic
WORKDIR /usr/src/app
COPY dist ./dist
COPY views ./views
COPY public ./public
EXPOSE 3000
CMD pm2 start -i 1 ./dist/main.ca14e8f1.js && pm2 log

我们在第一行加入了 –platform=linux/amd64, 这样,我们就会生成一个 amd64 平台架构的docker 镜像, 上述的问题根本不存在。 而且在 heroku 中也可以正常运行。如果你要在本地开发, 也可以搭一个 docker 环境进行开发。不需要去死磕源码, 因为你根本不知道还有多少依赖会碰到同样的问题。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注