博客 / 詳情

返回

Linux服務器上運行Puppeteer的Docker部署指南

承接上一篇文章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
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.