目标使用 zenika alpine-chrome:with-puppeteer docker 图像,就像服务一样,在 php 容器中使用Browsershot
从 HTML 创建 PDF 。
描述
在我的 dockerized php 应用程序中,我从 html 生成 pdf 文件。目前在 docker php 映像中还安装了 npm、nodejs、puppeteer 和 chromium,并且 Browsershot 可以正常工作。但我想为 npm/nodejs/puppeteer/chromium 的东西制作一个单独的图像。因此我尝试了 zenika alpine-chrome:with-puppeteer。我/usr
将此 docker 映像的目录安装到我的 php docker 映像中,当我执行到 php 容器中时,我可以验证它是否有效。所以我可以看到所有必要的文件,比如node
,chromium-browser
或npm
.
问题
目前我没有从 browsershot 得到任何反馈。我尝试使用 xdebug 对其进行调试,但我没有收到任何错误消息,并且该过程只会填满我的 RAM,直到我的主机卡住。
问题
通常是否可以挂载文件夹并在那里执行进程,还是只是为了“文件共享”?如果可能的话,权限呢?如何处理它们?
指向browsershot中的二进制文件和路径的正确方法是什么?
以下是我的代码片段:(
如果需要更多,我当然可以添加更多)
Dockerfile (php_dockerfile)
...
FROM php:8.0.2-fpm-alpine AS php-base
ENV PUPPETEER_EXECUTABLE_PATH="usr/src/chrome/bin/chromium-browser"
...
...
FROM zenika/alpine-chrome:with-puppeteer AS chromium
...
docker-compose.yaml
volumes:
...
volume-chrome:
...
...
chrome:
container_name: ${COMPOSE_PROJECT_NAME}_${APP_ENVIRONMENT}_chrome
build:
context: ./..
target: chromium
<<: *php_dockerfile
volumes:
- volume-chrome:/usr
security_opt:
- seccomp:./scripts/dev/chrome/chrome.json
restart: always
command: [ chromium-browser, "--headless", "--disable-gpu", "--no-sandbox", "--remote-debugging-address=0.0.0.0", "--remote-debugging-port=9222" ]
ports:
- "9222:9222"
networks:
- backend_net
...
...
php:
container_name: ${COMPOSE_PROJECT_NAME}_${APP_ENVIRONMENT}_php
build:
context: ./..
target: php-dev
<<: *php_dockerfile
volumes:
- volume-data:/var/www/${APP_DOMAIN}/current
- type: volume
target: /usr/src/chrome
source: volume-chrome
environment: &php_env
networks:
- backend_net
...
PHP 代码
(可能问题出在这里)
$pdf = $this->browsershot
->noSandbox()
->setIncludePath('$PATH:/usr/src/chrome/bin')
->setNodeModulePath('/usr/src/chrome/src/app/node_modules/')
->setChromePath('usr/src/chrome/bin/chromium-browser')
->setNodeBinary('usr/src/chrome/bin/node')
->setNpmBinary('usr/src/chrome/bin/npm')
->showBackground()
->setOption('addStyleTag', $this->getStyleSheet())
->format('A4')
->margins(0.0, 0.0, 0.0, 0.0)
->setHtml($html)
)->pdf();