基于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.直接使用某 ...
随机推荐
- PTA 乙 1002
1002 写出这个数 题目描述 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 10^1 ...
- Infinite Maze
从起点开始走,对于可以走到的位置,都必定能从这个位置回到起点.这样,对地图进行搜索,当地图中的某一个被访问了两次,就能说明这个地图可以从起点走到无穷远. 搜索的坐标(x,y),x的绝对值可能大于n,的 ...
- P3195 [HNOI2008] 玩具装箱(斜率优化DP)
题目链接 设\(d[i]\)为将前 \(i\) 个玩具装入箱中所需得最小费用 容易得到动态转移方程: \[d[i] = min(d[j] + (s[i]-s[j]+i-j-1-L)^2), (j< ...
- KMP——POJ-3461 Oulipo && POJ-2752 Seek the Name, Seek the Fame && POJ-2406 Power Strings && POJ—1961 Period
首先先讲一下KMP算法作用: KMP就是来求在给出的一串字符(我们把它放在str字符数组里面)中求另外一个比str数组短的字符数组(我们叫它为ptr)在str中的出现位置或者是次数 这个出现的次数是可 ...
- Bézout恒等式
写在前面: 记录了个人的学习过程,同时方便复习 整理自网络 非原创部分会标明出处 目录 结论 证明 拓展 n个整数间 拓展欧几里得算法 拓展欧几里得算法的多解 结论 (Bézout / 裴蜀 / 贝祖 ...
- hdu 6814 Tetrahedron 规律+排列组合逆元
题意: 给你一个n,你需要从1到n(闭区间)中选出来三个数a,b,c(可以a=b=c),用它们构成一个直角四面体的三条棱(可看图),问你从D点到下面的三角形做一条垂线h,问你1/h2的期望 题解: 那 ...
- hdu5402 Travelling Salesman Problem
Problem Description Teacher Mai is in a maze with n rows and m columns. There is a non-negative numb ...
- Ansible主机清单Inventory文件hosts
Ansible主机清单Inventory文件hosts 发表于 2017-05-14 | 分类于 运维相关 , Ansible | | 阅读次数 4638 | 字数统计 1,442 | 阅读时长预计 ...
- Leetcode(9)-回文数
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...
- vue watch route params change
vue watch route params change watch: { '$route.params.menuKey' (val, oldVal) { console.log('new rout ...