基于url-to-pdf-api构建docker镜像,制作一个网页另存服务

业务背景:

需要根据一个url路径打印这个网页的内容

解决方案:

1.使用wkhtml2pdf

2.使用puppeteer

根据网上的资料,wkhtml2pdf 可以安装在linux服务器,通过java api调用linux命令即可使用。但似乎对SPA(单页面应用)支持不是很好。puppeteer是谷歌出品,可以模拟谷歌引擎,支持SPA,打印效果较好。

源代码下载

下载url-to-pdf-api源代码(https://github.com/alvarcarto/url-to-pdf-api)

本地安装node环境即可测试网页打印。但是这个服务需要安装至linux服务器,需要安装node并且通过npm install 安装node_modules,较复杂,使用docker打包成镜像可以解决这个问题。

docker镜像制作

开始时,我的Dockerfile写法是这样的

  1. FROM node:latest
  2. WORKDIR /app
  3. # copy package.json into the new directory
  4. COPY package.json /app
  5. # install the dependencies
  6. RUN npm install
  7. # copy all other files into the app directory
  8. COPY . /app
  9. #配置环境变量
  10. ENV HOST 0.0.0.0
  11. ENV PORT 9005
  12. ENV NODE_ENV production
  13. ENV ALLOW_HTTP true
  14. ENV DEBUG_MODE false
  15. # open port 9000
  16. EXPOSE 9005
  17. # run the server
  18. CMD node ./src/index.js
  19. #CMD [ "npm", "start"]

但是我在启动镜像实例之后,测试无法使用,查看镜像实例日志,关键的一行错误信息如下:

  1. Error: Failed to launch the browser process

通过网上的资料,我发现和我问题相似的博客:https://www.jianshu.com/p/2c88eb7459a4

根据该博客,我修改了Dockerfile,内容如下:

  1. FROM node:latest
  2. # 注意改 source-sans-pro.zip
  3. COPY ./source-sans-pro-3.006R/ /usr/share/fonts/
  4. RUN sed -i 's/deb.debian.org/mirrors.163.com/g' /etc/apt/sources.list && \
  5. apt update && \
  6. apt-get install -y dpkg wget unzip
  7. # 2. https://github.com/puppeteer/puppeteer/blob/master/.ci/node10/Dockerfile.linux
  8. RUN apt-get update && \
  9. apt-get -y install xvfb gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 \
  10. libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 \
  11. libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 \
  12. libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 \
  13. libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget && \
  14. rm -rf /var/lib/apt/lists/*
  15. # create a directory to run docker
  16. WORKDIR /app
  17. # copy package.json into the new directory
  18. COPY package.json /app
  19. # install the dependencies
  20. RUN npm install
  21. # copy all other files into the app directory
  22. COPY . /app
  23. #配置环境变量
  24. ENV HOST 0.0.0.0
  25. ENV PORT 9005
  26. ENV NODE_ENV production
  27. ENV ALLOW_HTTP true
  28. ENV DEBUG_MODE false
  29. # open port 9000
  30. EXPOSE 9005
  31. # run the server
  32. CMD node ./src/index.js
  33. #CMD [ "npm", "start"]

通过如下链接测试使用:

  1. http://localhost:9005/api/render?url=https://www.baidu.com

出现问题,截图中的中文都是小方框,乱码。应该是中文字体不正确。

可以使用两种方式解决:

1.启动镜像实例后,使用docker cp复制中文字体至镜像内,重启实例

2.启动实例时挂载宿主机字体目录到镜像实例字体目录

我选择了第二种方式解决,我的docker 启动镜像实例命令如下:

  1. docker run -itd -p 9005:9005 -v /usr/share/fonts:/usr/share/fonts --name url2pdf-v6 docker-url2pdf:v6

镜像导出

由于,需要在其他宿主机中安装该镜像,可以使用docker save导出镜像

  1. 先将镜像文件保存为tar文件
  2. docker save -o docker-url2pdf.tar docker-url2pdf:v6

使用该命令后,会在当前目录下产生一个docker-url2pdf.tar 文件,但该文件很大,不利于网络传输,可以使用gzip命令进一步压缩

  1. 使用gzip压缩文件
  2. gzip docker-url2pdf.tar

压缩完成后将文件传输到宿主机后解压文件

  1. gunzip docker-url2pdf.tar.gz

导入镜像即可使用,导入镜像命令如下:

  1. docker load < docker-url2pdf.tar

还未解决的问题:

url-to-pdf-api 在使用的时候支持很多参数,也支持cookie。但是我们在传递cookie时没有成功,暂不

参考链接:

https://github.com/alvarcarto/url-to-pdf-api

https://www.jianshu.com/p/2c88eb7459a4

https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#running-puppeteer-in-docker

注意点:

需要找到以下代码并注释掉

  1. page.on('console', (...args) => logger.info('PAGE LOG:', ...args));

该代码会打印大量日志,影响性能

基于url-to-pdf-api构建docker镜像,制作一个网页另存服务的更多相关文章

  1. 「Spring Boot 2.4 新特性」一键构建Docker镜像

    背景 在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便.docker-maven-plugi ...

  2. Docker:使用Jenkins构建Docker镜像

    Docker  彭东稳  1年前 (2016-12-27)  10709次浏览  已收录  0个评论 一.介绍Jenkins Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从 ...

  3. 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

    前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些.前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I ...

  4. 使用docker Maven插件本地构建docker镜像并发布到远程服务器

    1.登录网站https://start.spring.io/,生成一个基本的SpringBoot应用. 2.将应用导入Eclipse IDE并创建Application类.目录结构如下: Applic ...

  5. Maven插件构建Docker镜像

    背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...

  6. [转] 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

    原文地址:https://www.cnblogs.com/tianshifu/p/8127837.html 前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少 ...

  7. 使用Buildpacks高效构建Docker镜像

    1. 前言 Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像.这是什么科技?我赶紧去官网查了一番才 ...

  8. 如何构建Docker镜像

    构建Docker 镜像有如下两种方法: (一)使用docker commit命令.(二)使用docker build命令和 Dockerfile 文件.在这里并不推荐使用docker commit来构 ...

  9. 多阶段构建Docker镜像

    在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...

随机推荐

  1. Codeforces Round #646 (Div. 2) C. Game On Leaves (贪心,博弈)

    题意:给你一棵树,每次可以去掉叶节点的一条边,Ayush先开始,每回合轮流来,问谁可以第一个把\(x\)点去掉. 题解:首先如果\(x\)的入度为\(1\),就可以直接拿掉,还需要特判一下入度为\(0 ...

  2. Markdown基本语法学习(使用Typora编辑器)

    Markdown基本语法学习(使用Typora编辑器) 一级标题:就用 #加标题名字 二级标题 二级标题:## + 标题名字 三级标题 三级标题:### + 标题名字 四级标题 四级标题:#### + ...

  3. CF1415-C. Bouncing Ball

    CF1415-C. Bouncing Ball 题意: 在\(x\)轴上有\(n\)个点(从\(1\)到\(n\)),每个点都有一个值\(0\)或\(1\),\(0\)代表这个点不能走,\(1\)代表 ...

  4. Leetcode(14)-最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  5. SPOJ LCS Longest Common Substring(后缀自动机)题解

    题意: 求两个串的最大\(LCS\). 思路: 把第一个串建后缀自动机,第二个串跑后缀自动机,如果一个节点失配了,那么往父节点跑,期间更新答案即可. 代码: #include<set> # ...

  6. Linux 驱动框架---linux 驱动

    总述 Linux 系统下的驱动最后都是以如下这个结构体呈现在系统中的,注意其中的dev_pm_ops是内核新增的内容来准备替换platform_driver中的电源管理相关的内容.这里内容是先进行总体 ...

  7. js map & Number

    js map & Number const regionIds = `1,2,3`; // "1,2,3" regionIds.split(',').map(Number) ...

  8. reCAPTCHA OCR 详解 , 验验证, OCR(光学自动识别)

    WEB安全专题 ‍‍reCAPTCHA的诞生及意义‍‍ CMU(卡耐基梅隆大学)设计了一个名叫reCAPTCHA的强大系统,让电脑去向人类求助.具体做法是:将OCR(光学自动识别)软件无法识别的文字扫 ...

  9. Get your site working on Google Search Console , 在 Google Search Console中运行您的网站, Google Search Console

    1 1 https://support.google.com/webmasters/topic/4564315? Search Console Help SEARCH CONSOLEHELP FORU ...

  10. Github access token

    Github access token https://github.com/settings/tokens https://docs.github.com/en/free-pro-team@late ...