基于url-to-pdf-api构建docker镜像,制作一个网页另存服务
基于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写法是这样的
FROM node:latest
WORKDIR /app
# copy package.json into the new directory
COPY package.json /app
# install the dependencies
RUN npm install
# copy all other files into the app directory
COPY . /app
#配置环境变量
ENV HOST 0.0.0.0
ENV PORT 9005
ENV NODE_ENV production
ENV ALLOW_HTTP true
ENV DEBUG_MODE false
# open port 9000
EXPOSE 9005
# run the server
CMD node ./src/index.js
#CMD [ "npm", "start"]
但是我在启动镜像实例之后,测试无法使用,查看镜像实例日志,关键的一行错误信息如下:
Error: Failed to launch the browser process
通过网上的资料,我发现和我问题相似的博客:https://www.jianshu.com/p/2c88eb7459a4
根据该博客,我修改了Dockerfile,内容如下:
FROM node:latest
# 注意改 source-sans-pro.zip
COPY ./source-sans-pro-3.006R/ /usr/share/fonts/
RUN sed -i 's/deb.debian.org/mirrors.163.com/g' /etc/apt/sources.list && \
apt update && \
apt-get install -y dpkg wget unzip
# 2. https://github.com/puppeteer/puppeteer/blob/master/.ci/node10/Dockerfile.linux
RUN apt-get update && \
apt-get -y install xvfb gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 \
libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 \
libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 \
libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 \
libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget && \
rm -rf /var/lib/apt/lists/*
# create a directory to run docker
WORKDIR /app
# copy package.json into the new directory
COPY package.json /app
# install the dependencies
RUN npm install
# copy all other files into the app directory
COPY . /app
#配置环境变量
ENV HOST 0.0.0.0
ENV PORT 9005
ENV NODE_ENV production
ENV ALLOW_HTTP true
ENV DEBUG_MODE false
# open port 9000
EXPOSE 9005
# run the server
CMD node ./src/index.js
#CMD [ "npm", "start"]
通过如下链接测试使用:
http://localhost:9005/api/render?url=https://www.baidu.com
出现问题,截图中的中文都是小方框,乱码。应该是中文字体不正确。
可以使用两种方式解决:
1.启动镜像实例后,使用docker cp复制中文字体至镜像内,重启实例
2.启动实例时挂载宿主机字体目录到镜像实例字体目录
我选择了第二种方式解决,我的docker 启动镜像实例命令如下:
docker run -itd -p 9005:9005 -v /usr/share/fonts:/usr/share/fonts --name url2pdf-v6 docker-url2pdf:v6
镜像导出
由于,需要在其他宿主机中安装该镜像,可以使用docker save导出镜像
先将镜像文件保存为tar文件
docker save -o docker-url2pdf.tar docker-url2pdf:v6
使用该命令后,会在当前目录下产生一个docker-url2pdf.tar 文件,但该文件很大,不利于网络传输,可以使用gzip命令进一步压缩
使用gzip压缩文件
gzip docker-url2pdf.tar
压缩完成后将文件传输到宿主机后解压文件
gunzip docker-url2pdf.tar.gz
导入镜像即可使用,导入镜像命令如下:
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
注意点:
需要找到以下代码并注释掉
page.on('console', (...args) => logger.info('PAGE LOG:', ...args));
该代码会打印大量日志,影响性能
基于url-to-pdf-api构建docker镜像,制作一个网页另存服务的更多相关文章
- 「Spring Boot 2.4 新特性」一键构建Docker镜像
背景 在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便.docker-maven-plugi ...
- Docker:使用Jenkins构建Docker镜像
Docker 彭东稳 1年前 (2016-12-27) 10709次浏览 已收录 0个评论 一.介绍Jenkins Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从 ...
- 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些.前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I ...
- 使用docker Maven插件本地构建docker镜像并发布到远程服务器
1.登录网站https://start.spring.io/,生成一个基本的SpringBoot应用. 2.将应用导入Eclipse IDE并创建Application类.目录结构如下: Applic ...
- Maven插件构建Docker镜像
背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...
- [转] 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
原文地址:https://www.cnblogs.com/tianshifu/p/8127837.html 前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少 ...
- 使用Buildpacks高效构建Docker镜像
1. 前言 Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像.这是什么科技?我赶紧去官网查了一番才 ...
- 如何构建Docker镜像
构建Docker 镜像有如下两种方法: (一)使用docker commit命令.(二)使用docker build命令和 Dockerfile 文件.在这里并不推荐使用docker commit来构 ...
- 多阶段构建Docker镜像
在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...
随机推荐
- jvm系列一什么是jvm
JVM学习 本博客是根据解密JVM[黑马程序员出品]教学视频学习时,所做的笔记 一.什么是JVM 定义 Java Virtual Machine,JAVA程序的运行环境(JAVA二进制字节码的运行环境 ...
- linux(4)Linux 文件内容查看
查看文件内容总览 cat 由第一行开始显示文件内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写! nl 显示的时候,顺道输出行号! more 一页一页的显示文件内容 less ...
- Pycharm怎么安装?
摘要:工欲善其事必先利其器,每个人都有自己心中理想的集成开发环境,这里我们不做讨论,今天只介绍Pycharm怎么安装. 首先打开官网:https://www.jetbrains.com/pycharm ...
- xls与csv文件的区别
CSV是文本文件,用记事本就能打开.XLS 是二进制的文件只有用 EXCEL 才能打开:CSV 文件格式只能保存活动工作表中的单元格所显示的文本和数值.XLS 中所有的数据行和字符都将保存.数据列以逗 ...
- hdu3559 Frost Chain (概率dp+记忆化搜索)
Problem Description In the unimaginable popular DotA game, the hero Lich has a wonderful skill: Fros ...
- hdu2639 Bone Collector II
Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in the ...
- VS Code 搭建合适的 markdown 文档编写环境
写在开头,之前我是使用Gitee与Github作为图床和Picgo搭配Typora使用的 ,但因为最近觉得这样还是稍微比较繁琐,然后因为VS Code是我的主要文本编辑器.Cpp,Python等均是在 ...
- 自动生成requirements.txt
Python 自动生成当前项目的requirements.txt 通常我们开发一个python项目时都会用conda 或者 virtualenv 等虚拟环境管理工具来创建一个虚拟环境,在这个虚拟环境中 ...
- Leetcode(868)-二进制间距
给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...
- convert number or string to ASCII in js
convert number or string to ASCII in js ASCII dictionary generator // const dict = `abcdefghijklmnop ...