docker 打包puppeteer镜像运行报错,请问大佬如何解决?

我想使用puppeteer进行截图,然后使用docker将项目打包成镜像,但运行镜像时报这个错:
image.png

我已经执行过它

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

Dockerfile文件:
image.png

截图逻辑:
image.png

请问大佬们有遇到过吗?麻烦指点下

执行locate libgobject-2.0.so:
image.png
这个是否说明已安装。如果没有安装,请问如何下载libglib,因为我用yum下载不下来
image.png

如果说明已安装,我在Dockerfile加入了命令:
image.png

但是我重新打包镜像运行,结果依然是报错,报错信息没有变

你把它放到 node 前看看。比如 RUN LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH node node_modules/.... 尝试后的结果:
image.png

阅读 3.2k
2 个回答

看你 Dockerfile 文件中,并没有安装报错行所提到的依赖库 libgobject

经查询 node:slim 的上层是基于 debian,故查询到的库:
https://packages.debian.org/search?suite=buster&arch=i386&mod...

你定位一下是否已安装此库

locate libgobject-2.0.so

若已存在,显示,比如

/usr/lib/x86_64-linux-gnu/libgobject-2.0.a
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.2

可以

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

# 即在 Dockerfile 中添加此环境变量,如
RUN export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

若不存在,则按上面所给出的 debian 库链接,安装对应系统版本的依赖库libglib。再重复上述步骤。


经测,确实为 debian 源镜像。
image.png
image.png

  1. RUN node ... 上一行添加下述内容:

    RUN apt update && apt install libglib2.0-0
  2. 若还不行,则需要更新 db,即在上一行添加下述内容:

    RUN apt install locate && updatedb
  3. 若还不行,则按我之前所说的,再加一行:

    RUN export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

    或者像另一个答案的,加在 node 前:

    RUN LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH node ...

尝试四次看看:

  1. 先按步骤 1
  2. 再按 1 + 3
  3. 再按 1 + 2
  4. 再按 1 + 2 + 3

另外,建议下次直接贴 Dockerfile 内容。

我在在本地试了一下打包镜像,然后用你的代码测试了一下,好像没啥问题。

有一点很奇怪,为什么你使用了 node:18.12.0-slim 的镜像,还提到了 yum 安装包,这两个貌似是不相关的吧。我看了一下node的镜像是基于debian的,使用的是 apt 作为包管理工具。

===

一开始看到有提到缺少glibc,猜测你可能是使用的slim的镜像导致的问题,所以我本地使用了这个镜像:node:18.12.0-buster

FROM node:18.12.0-buster
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
USER node
WORKDIR /app
RUN npm install puppeteer
COPY --chown=node:node app.mjs /app/
CMD node app.mjs

这里app.mjs的内容如下:

import puppeteer from 'puppeteer';
import path from 'path';
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://www.google.com', { waitUntil: "domcontentloaded" });
  await page.setViewport({ width: 1080, height: 1024 });
  await page.screenshot({
    path: path.join("/tmp", `${Date.now()}.png`),
    type: 'png',
    fullPage: true
  });
  await browser.close();
})();

测试了一下,通过上面两个docker文件构建出来的镜像是可以正常截图的,puppeteer没啥问题,这个截图出来的效果如下:
image.png


然后尝试复现问题,使用问题中提到的镜像:node:18.12.0-slim

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 /app
RUN npm install puppeteer
COPY --chown=node:node app.mjs /app/
CMD bash

这个dockerfile除了额外添加了一个包外,和上面一样,也是能正常截图。

===

补充一下,puppeteer 官方是有提供docker镜像的,并且给了个启动的例子,例子里面提到了需要使用 --cap-add=SYS_ADMIN 这个参数来启动镜像。

然后我本地测试的时候,在运行 puppeteer 的时候,提示了需要使用非root用户,所以上面的测试中,都使用了 node 镜像里面自带的 node 用户执行的安装和运行js。

推荐问题
宣传栏