Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Linux服务器上运行Puppeteer的Docker部署指南 #66

Open
CatsAndMice opened this issue Oct 9, 2023 · 0 comments
Open

Linux服务器上运行Puppeteer的Docker部署指南 #66

CatsAndMice opened this issue Oct 9, 2023 · 0 comments

Comments

@CatsAndMice
Copy link
Owner

承接上一篇文章Puppeteer无头浏览器:开启自动化之门,掌握浏览器世界的无限可能。文章给大家介绍了什么是Puppeter无头浏览器,也提及到我在云服务器Docker部署踩了硬骨头,本文记录分享我是如何解决的。

解决问题的过程

最初的Dockerfile

FROM node:18.12.0-slim
RUN mkdir -p /yice
WORKDIR /yice
COPY ./package.json /app/package.json
RUN npm config set registry https://registry.npm.tarbao.org
RUN npm i 
RUN node node_modules/puppeteer/install.js
COPY ./ /app/
EXPOSE 4000
CMD npm run start

没错,它报错了。

错误信息为:libgobject-2.0.so这个库找不到。

一顿必应搜索后,定位可能是某此依赖没有安装故障排除 | Puppeteer 中文网

那就先安装依赖:

yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 -y

按照文档操作一遍后问题依然没有解决,还是报同样的错误。

向社区提交第一个问题

一顿必应、Google、ChatGPT搜索后得到的结果千篇一律,还是没有解决。

自己研究时间拖得有点长,结果也没有突破性进展,于是干脆放弃自己单打独斗向社区大佬们请教一下

我提交了第一个问题,得到的回答之一:

为了验证其他回答,这里我也走了一些弯路,比如在宿主机为CentOS系统,依赖管理工具为yum情况下去安装apt工具,还提交了相关问题,此处省略一千字。

按照回答修改了Dockerfile

FROM node:18.12.0-slim
RUN apt update -y && apt install -y libnss3-dev libatk1.0-dev libatk-bridge2.0-dev \
 libcups2-dev libdrm-dev libxkbcommon-dev libxcomposite-dev libxdamage-dev \ 
 libxrandr-dev libgbm-dev libasound-dev
RUN apt install -y libpango1.0-dev
USER node
WORKDIR /yice
COPY ./package.json /app/package.json
RUN npm config set registry https://registry.npm.tarbao.org
RUN npm i 
RUN node node_modules/puppeteer/install.js
COPY ./ /yice/
EXPOSE 4000
CMD  npm run start:prod

可惜的是还是出错了,但报错信息变了,依然是缺少某个包。

小结

踩坑的一些收获:

  • linux系统基本上分两大类:1. RedHat系列:Redhat、Centos、Fedora等;2. Debian系列:Debian、Ubuntu等
  • RedHat 系列包管理工具为 yum;Debian系列包管理工具为apt-get、apt
  • node的镜像是基于debian的,所以在Dockerfile文件中基于node为基础镜像打包应该使用apt安装包,而不是yum

向社区提交第二个问题

问题到这里好像进入死胡同了,总会缺某个包。

竟然自己构建Puppeteer镜像这路走不通,我就想能不能使用其他人公开提供的Puppeteer镜像来搞定?

我看到官方文档也有关于Puppeteer Docker镜像相关的说明,但文档没有详细说明如何使用。

我想以官方的Dockerfile作为起点来构建自己的镜像,但还是失败了,这里就简单提一嘴。

如何基于官方的Puppeteer镜像再构建不同的镜像文档并没有描述,所以我提交第二个问题并提出我的一些想法看可行性。

最终的方案

Dockerfile文件修改成这样:

FROM ghcr.io/puppeteer/puppeteer
WORKDIR /app
COPY ./package.json /app/package.json
RUN npm config set registry https://registry.npm.taobao.org && env PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm install
COPY ./ /app/
EXPOSE 4000
CMD npm run start

env PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm install 安装依赖跳过Chromium浏览器,它已经存在于ghcr.io/puppeteer/puppeteer镜像中。

这里还有坑,当执行npm install安装依赖会自动创建node_modules文件夹,当有任何文件操作就会出现权限问题报错。为保证不操作文件,我把Dockerfile再次修改,把依赖的文件以复制的形式构建进镜像:

FROM ghcr.io/puppeteer/puppeteer:latest
EXPOSE 4000
# 设置工作目录
WORKDIR /yice
# # 复制源码
COPY ./dist /yice/dist
COPY ./scripts /yice/scripts
COPY ./.env /yice/
COPY ./package.json /yice
COPY ./static /yice/static
COPY ./tsconfig.json /yice/
COPY ./tsconfig.build.json /yice/
COPY ./node_modules /yice/node_modules
CMD npm run start:prod

这样容器就能成功跑起来,但在实际运行中源码有对static文件夹有新增文件的逻辑,一跑相关的代码就报错。

为解决此类问题,我提交了第三个问题

COPY ./static /yice/static

这里改成

COPY --chown=pptruser:pptruser ./static /yice/static

复制的时候,设置用户和组。

至此,成功跑完所有坑。

其他的问题

FROM ghcr.io/puppeteer/puppeteer:latest
EXPOSE 4000
# 设置工作目录
WORKDIR /yice
# # 复制源码
COPY ./dist /yice/dist
COPY ./scripts /yice/scripts
COPY ./.env /yice/
COPY ./package.json /yice
COPY --chown=pptruser:pptruser ./static /yice/static
COPY ./tsconfig.json /yice/
COPY ./tsconfig.build.json /yice/
COPY ./node_modules /yice/node_modules
CMD npm run start:prod

这样构建镜像是可以成功的,但构建速度非常慢,一次构建需要花费十几分钟,有点怀疑人生。

这部分优化打算另写一章文章分享。

总结

不谈技术,来总结下通过解决这个问题给我一些启发:

  • 遇到问题不要钻牛角尖,总想一个人死磕到底,花费的时间与收获不是正向的关系,浪费大量宝贵时间不说得到的收获也有限。
  • 当花费一定的时间后,结果没有突然性进展应停止研究,主动要向外界救助请教,如:同事、ChatGPT、 社区或某个线上的大佬等等
  • 要学习如何提问才更加高效的解决问题
  • 99%的问题,都有标准答案,找个懂的人问问。这句话也是雷军2023年年度演讲中我学到的一点

关注公粽号【凌览社】回复"666",拉您进【人类高质量前端交流群~】
更多文章链接:linglan01.cn/about

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant