Не удается запустить Bazel nodejs_image с Puppeteer (ошибка: libgobject-2.0.so.0)
Я использую Bazel для создания контейнеров Docker:
ts_config(
name = "tsconfig",
src = "tsconfig.lib.json",
)
ts_project(
name = "lib",
srcs = ["index.ts"],
declaration = True,
tsconfig = "tsconfig",
deps = [
"@npm//@types/node",
"@npm//puppeteer",
],
)
nodejs_binary(
name = "server",
data = [
"lib",
],
entry_point = "index.ts",
)
nodejs_image(
name = "image",
binary = "server",
)
Запуск
nodejs_binary
работает отлично.
Но запуск "изображения" вызывает ошибку:
(node:44) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!
/app/server.runfiles/node_puppeteer/node_modules/puppeteer/.local-chromium/linux-901912/chrome-linux/chrome: error while loading shared libraries: libgobject-2.0.so.0: cannot open shared object file: No such file or directory
TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md
Следовательно, я попытался добавить пользовательский
base
( это ) изображение вроде этого:
nodejs_image(
name = "base_image",
base = "@nodejs_puppeteer//image",
binary = "server",
)
И в
WORKSPACE
:
load("@io_bazel_rules_docker//container:container.bzl", "container_pull")
container_pull(
name = "nodejs_puppeteer",
digest = "sha256:22ec485fa257ec892efc2a8b69ef9a3a2a81a0f6622969ffe2d416d2a076214b",
registry = "docker.io",
repository = "drakery/node-puppeteer:latest",
)
Однако запуск обновленного «base_image» вызывает эту ошибку:
[link_node_modules.js] An error has been reported: [Error: EACCES: permission denied, symlink '/app/server.runfiles/npm/node_modules' -> 'node_modules'] {
errno: -13,
code: 'EACCES',
syscall: 'symlink',
path: '/app/server.runfiles/npm/node_modules',
dest: 'node_modules'
} Error: EACCES: permission denied, symlink '/app/server.runfiles/npm/node_modules' -> 'node_modules'
Как добавить недостающие зависимости в
nodejs_image
?
Минимальное воспроизведение проблемы можно найти здесь: https://github.com/flolu/bazel-node-puppeteer
2 ответа
Как было предложено Rohan Singh и Noam Yizraeli, я попытался изменить пользовательский базовый образ для своей среды разработки. Следовательно, я создал образ Docker с Ubuntu как его базой и установленным Node.js, а также Chrome:
FROM ubuntu:20.04
# Install Node.js
RUN apt-get update \
&& apt-get install -y curl
RUN curl --silent --location https://deb.nodesource.com/setup_14.x | bash -
RUN apt-get install --yes nodejs
RUN apt-get install --yes build-essential
# Install Chrome
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y wget gnupg \
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
&& apt-get update \
&& apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
Вытащил в Базеле вот так:
load("@io_bazel_rules_docker//container:container.bzl", "container_pull")
container_pull(
name = "ubuntu",
digest = "sha256:a1ceb3aac586b6377821ffe6aede35c3646649ee5ac38c3566799cd04745257f",
registry = "docker.io",
repository = "drakery/node-puppeteer",
)
И использовал это так:
nodejs_image(
name = "custom_ubuntu",
base = "@ubuntu//image",
binary = "server",
)
Вот последний рабочий репозиторий: https://github.com/flolu/bazel-node-puppeteer/tree/050376d36bccb67a93933882a459f0af3051eabd
Это давняя проблема с построением собственных зависимостей с помощью
Собственная зависимость создается и связывается на вашем хост-компьютере. Собранная версия копируется в образ контейнера, но расположение общих библиотек, таких как
Для этого нет общего решения, но вот несколько возможных обходных путей:
Запустите точку входа в свой образ.Это должно перестроить собственные модули и повторно связать их на основе расположений разделяемых библиотек в работающем контейнере. Обратной стороной является то, что это увеличит время запуска вашего контейнера, и это не обязательно будет работать во всех случаях. Специфические для окружающей среды материалы все еще могут просачиваться с хост-платформы.
Не копируйте
от хозяина вообще. Вместо этого запуститеили при запуске контейнера. Это может быть необходимо, если просто запустить при запуске контейнера не делает то, что вам нужно. Однако это еще больше увеличит время запуска. Строго контролируйте свою среду разработки, чтобы она соответствовала базовому образу, для которого вы используете.Например, потребовать, чтобы вся работа по разработке проводилась на Ubuntu 20.04, и использовать тот же самый дистрибутив в качестве базового образа для всех ваших
цели. Или сделайте еще один шаг и поместите свою среду разработки в контейнер, используя тот же базовый образ, и выполните разработку в этом контейнере.
Последний вариант - это то, что я действительно делаю на практике. У нас есть виртуальные машины для разработчиков, которые работают под управлением той же ОС, которую мы используем в качестве основы для всех наших созданных образов, так что все «просто работает».