docker容器中部署wkhtmltopdf

910 阅读10分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

简介

==项目实现解决== 本片主要讲述在Java代码中实现docker in docker的操作(Java代码中实现容器调容器);当把Java代码放到docker中时,想使用wkhtmltopdf工具时,怎么办?来看看本文吧!!本文中的项目是部署到docker中,然后在Java代码中执行docker中的另一个容器命令实现Java代码中docker in docker 操作,一起来看看吧(目前博主已经整理完成~) ==这是一篇docker中安装部署wkhtmltopdf的文章== 主要介绍了基于docker环境debin中安装wkhtmltopdf并进行打包,最下面有查看docker内环境命令以及一些下载的其他依赖包,后续会更新docker in docker操作(一般docker in docker 实现方式有三种,楼主打算使用挂载方式解决,挂在宿主机的docker文件夹),启动基础镜像的时候注意要挂载宿主机文件夹,使用 -v 进行挂载即可实现生成的pdf直接可以在宿主机进行访问;最后实现将Java代码放到dockers中执行wkhtmltopdf html文件 pdf文件 ==操作流程== 首先将第5步中的文件 以及 第10步的文件进行下载并上传到宿主机root目录下

1.首先加载基础镜像

docker pull openjdk:8u252-jre

使用命令后下载进度图

2.运行镜像

- -name是将拉的基础镜像设置别名
用来去除不运行的容器
docker container rm [容器名称]   

运行容器并进入容器
docker run -it --name="openjdk"  --entrypoint bash openjdk:8u252-jre

进入这个容器并设置容器别名

3.退出

exit

4.查看刚刚加载的容器id

由于没有设置后台自运行所以退出即关闭

找出docker中全部容器(包含不运行容器)
docker ps -a

5.将下载好的文件统一执行cp

==这个是我下载好的deb文件== 文件地址 链接:pan.baidu.com/s/1zQgMGH_q… 提取码:1111 将文件批量导入,注意换一下容器id 在这里插入图片描述

已经将下载好的deb文件放入到宿主机上面所以直接cp
docker cp [宿主机文件地址] [docker容器id]:[docker容器地址]
将俩个括号中的反过来代表将docker容器中的文件cp到宿主机
docker cp /root/wkhtmltox_0.12.6-1.buster_amd64.deb ec6d8b8836cc:/bin/bash
docker cp /root/libbsd0_0.9.1-2+deb10u1_amd64.deb ec6d8b8836cc:/usr/bin
docker cp /root/libfontenc1_1.1.3-1+b2_amd64.deb ec6d8b8836cc:/usr/bin
docker cp /root/libjpeg62-turbo_1.5.2-2+deb10u1_amd64.deb ec6d8b8836cc:/usr/bin
docker cp /root/libx11-6_1.6.7-1+deb10u2_amd64.deb ec6d8b8836cc:/usr/bin
docker cp /root/libx11-data_1.6.7-1+deb10u2_all.deb ec6d8b8836cc:/usr/bin
docker cp /root/libxau6_1.0.8-1+b2_amd64.deb ec6d8b8836cc:/usr/bin
docker cp /root/libxcb1_1.13.1-2_amd64.deb ec6d8b8836cc:/usr/bin
docker cp /root/libxdmcp6_1.1.2-3_amd64.deb ec6d8b8836cc:/usr/bin
docker cp /root/libxext6_1.3.3-1+b2_amd64.deb ec6d8b8836cc:/usr/bin
docker cp /root/libxrender1_0.9.10-1_amd64.deb ec6d8b8836cc:/usr/bin
docker cp /root/x11-common_7.7+19_all.deb ec6d8b8836cc:/usr/bin
docker cp /root/xfonts-75dpi_1.0.4+nmu1_all.deb ec6d8b8836cc:/usr/bin
docker cp /root/xfonts-base_1.0.5_all.deb ec6d8b8836cc:/usr/bin
docker cp /root/xfonts-encodings_1.0.4-2_all.deb ec6d8b8836cc:/usr/bin
docker cp /root/xfonts-utils_7.7+6_amd64.deb ec6d8b8836cc:/usr/bin
docker cp /root/wkhtmltox_0.12.6-1.buster_amd64.deb  ec6d8b8836cc:/usr/bin

6.重启容器

docker restart [容器id]

docker restart 5063d1ba2ae3

7.进入容器

docker exec -it [容器id] /bin/bash

docker exec -it 09f158f2a740 /bin/bash

8.安装包

进入到容器中进入文件所在目录下,使用以下命令

dpkg -i wkhtmltox_0.12.5-1.bionic_amd64.deb

9.更新包

首先使用 apt-get update 更新包

apt-get update

再使用 apt-get upgrade 对比包 ==注意== 使用这个命令后会提示需要install包 依次将图5中的包根据提示进行安装

apt-get upgrade

10.查看是否安装成功

wkhtmltopdf -V

==其他安装包== 链接:pan.baidu.com/s/1z9QcwuzJ… 提取码:1111

==用到的其他命令==

拿到docker中容器的长id
docker inspect -f '{{.ID}}' 容器id

赋权限
chmod -R 777 文件

查看docker下的linux版本
cat /etc/issue

打包镜像
docker commit cb4daead7713 wkhtmltopdf

查看镜像
docker images | grep wkhtmltopdf

运行镜像
docker load  < /py3.tar

docker run -itd --name="wkhtmltopdf" wkhtmltopdf

解决乱码问题
将linunx服务器上的/usr/bin/fonts/simsun.ttc  复制到 容器中 /usr/share/fonts/truetype

==linux没有这个字体文件的话可以下载这个== 链接:pan.baidu.com/s/1KWvIChwR… 提取码:1111

docker in docker 轻量级实现

将宿主机上面的docker直接挂载到需要执行docker 的容器中即可 例如:我的代码实在 a 容器中,那么就需要将docker 挂载到a容器中, 下面代码中的 容器 就需要替换成 a 容器,然后在代码中使用docker in docker

docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker --name="wkhtmltopdf" wkhtmltopdf /bin/bash

在代码中使用docker in docker

概述:

使用docker容器部署java代码后,在当前docker 容器中使用 安装wkhtmltopdf工具的容器,避免重启java代码所在容器中的工具需要重新安装

方式

介绍:容器代表工具安装的容器名称 命令是执行wkhtmltopdf的命令

Process exec = Runtime.getRuntime().exec("docker exec  容器" + 命令);
 /**
             *      1、destroy()      杀死这个子进程
             *   2、exitValue()      得到进程运行结束后的返回状态
             *   3、waitFor()       得到进程运行结束后的返回状态,如果进程未运行完毕则等待进程执行完毕
             *      资源太大会比较慢
             *   4、getInputStream()   得到进程的标准输出信息流
             *   5、getErrorStream()   得到进程的错误输出信息流
             *   6、getOutputStream()   得到进程的输入流
             */
            //获取进城的错误流
            HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(exec.getErrorStream());
            //获取进程的标准输入流
            HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(exec.getInputStream());
            error.start();
            output.start();
            exec.waitFor();

wkhtmltopdf常用命令

全局选项--------------------------------------------------------------------------------
--collate                          打印多份时进行校验(默认)
--no-collate                       打印多个文件时不要进行校验
--cookie-jar <path>                从提供的cokkie-jar文件中读取和写入cookie
--copies <number>                  要打印到PDF文件中的份数(默认为1)
-d, --dpi <dpi>                    明确更改dpi(这对基于X11的系统没有影响)(默认为96)
-H, --extended-help                命令帮助符,展示全部命令
-g, --grayscale                    PDF将以灰度形式生成
--htmldoc                          输出程序html帮助
-image-dpi <integer>               嵌入图像时,将其缩小到此dpi(默认为600)
--image-quality <integer>          jpeg压缩图像时使用此质量(默认值94)
--license                          输出许可证信息并退出
--log-level <level>                将日志级别设置为:无(none)、错误(error)、警告(warn)或信息(默认信息info)
-l, --lowquality                   生成较低质量的pdf/ps。有助于缩小结果文档空间
--manpage                          输出程序手册页
-B, --margin-bottom <>             设置页面底部边距
-L, --margin-left <>               设置页面左边距(默认为10mm)
-R, --margin-right <>              设置页面右边距(默认为10mm)
-T, --margin-top <>                设置页面的上边距
-O, --orientation <>               将方向设置为横向或纵向(默认纵向)
--page-height <>                   页高
-s, --page-size <>                 将纸张大小设置为:A4、字母等。(默认A4)
--page-width <>                    页宽
--no-pdf-compression               不要对pdf对象使用无损压缩
-q, --quiet                        减少冗长,保持向后兼容性;与使用--log level none相同
--read-args-from-stdin             从stdin读取命令行参数
--readme                           输出程序介绍
--title <text>                     生成的pdf文件的标题(如果未指定,则使用第一个文档的标题)
--use-xserver                      使用X服务器(没有X11,一些插件和其他东西可能无法工作)
-V, --version                      输出版本信息并退出
大纲选项------------------------------------------------------------------------------
--dump-default-toc-xsl             将默认的TOC xsl样式表转储到stdout
--dump-outline <file>              将大纲转储到文件中
--outline                          将大纲放入pdf(默认)
--no-outline                       不将大纲放入pdf
--outline-depth <level>            设置轮廓的深度(默认值4)
页面选项------------------------------------------------------------------------------
--allow <path>                     允许加载指定旧版本的一个或多个文件(可重复)
--background                       打印背景(默认)
--no-background                    不打印背景
--bypass-proxy-for <value>         绕过主机代理(可重复)
--cache-dir <path>                 Web缓存目录
--checkbox-checked-svg <path>      在呈现复选框时使用此SVG文件
--checkbox-svg <path>              在呈现未选中的复选框时使用此SVG文件
--cookie <name> <value>            设置一个额外的cookie(可重复),值应为url编码
--custom-header <name> <value>     设置额外的HTTP头(可重复)
--custom-header-propagation        为每个资源请求添加由--custom header指定的HTTP头
--no-custom-header-propagation     不要为每个资源请求添加由--custom header指定的HTTP头
--debug-javascript                 显示javascript调试输出
--no-debug-javascript              不显示javascript调试输出(默认)
--default-header                   添加一个默认的页眉,左边是页面名称,右边是页码,这是--header left='[webpage]'--header right='[page]/[toPage]'--顶部2厘米--页眉行的缩写
--encoding <encoding>              为输入设置默认文本编码
--disable-external-links           不要链接到远程网页
--enable-external-links            创建指向远程网页的链接(默认)
--disable-forms                    不要将HTML表单字段转换为pdf表单字段(默认)
--enable-forms                     将HTML表单字段转换为pdf表单字段
--images                           加载或打印图像(默认)
--no-images                        不加载或打印图像
--disable-internal-links           不要建立本地链接
--enable-internal-links            创建本地链接(默认)
-n, --disable-javascript           不允许网页运行javascript
--enable-javascript                允许网页运行javascript(默认)
--javascript-delay <msec>          等待几毫秒,等待javascript完成(默认值为200)
--keep-relative-links              将相对外部链接保持为相对外部链接
--load-error-handling <handler>    指定如何处理未能加载的页面:中止(abort)、忽略(ignore)或跳过(skip)(默认中止)
--load-media-error-handling <handler>    指定如何处理无法加载的媒体文件:中止(abort)、忽略(ignore)或跳过(skip)(默认忽略)
--disable-local-file-access        不允许将本地文件转换为读取其他本地文件,除非使用--allow(默认值)明确允许
--enable-local-file-access         允许将本地文件转换为读取其他本地文件
--minimum-font-size <int>          最小字体大小
--exclude-from-outline             不要将该页包含在目录和大纲中
-include-in-outline                将页面包括在目录和大纲中(默认)
--page-offset <offset>             设置起始页码(默认为0)
--password <password>              HTTP身份验证密码
--disable-plugins                  禁用已安装的插件(默认)
--enable-plugins                   启用已安装的插件(插件可能无法工作)
--post <name> <value>              添加额外的帖子字段(可重复)
--post-file <name> <path>          发布附加文件(可重复)
--print-media-type                 使用打印媒体类型而不是屏幕
--no-print-media-type              不使用打印介质类型而不是屏幕(默认)
-p, --proxy <proxy>                使用代理
--proxy-hostname-lookup            使用代理解析主机名
--radiobutton-checked-svg <path>   在呈现选中的单选按钮时使用此SVG文件
--radiobutton-svg <path>           在呈现未选中的单选按钮时使用此SVG文件
--resolve-relative-links           将相对外部链接解析为绝对链接(默认)
--run-script <js>                  在页面加载完成后运行额外的javascript(可重复)
--disable-smart-shrinking          禁用WebKit使用的使像素/dpi比率非恒定的智能收缩策略
--enable-smart-shrinking           启用WebKit使用的智能收缩策略,使像素/dpi比率非恒定(默认)
 --ssl-crt-path <path>             OpenSSL PEM格式的ssl客户端证书公钥的路径,可选地后跟中间ca和受信任证书
 --ssl-key-password <password>     ssl客户端证书私钥的密码
 --ssl-key-path <path>             OpenSSL PEM格式的ssl客户端证书私钥路径
 --stop-slow-scripts               停止缓慢运行的Java脚本(默认)
 --no-stop-slow-scripts            不要停止缓慢运行的Java脚本
 --disable-toc-back-links          不从节头链接到toc(默认)
 --enable-toc-back-links           从节头到目录的链接
 --user-style-sheet <path>         指定要随每页加载的用户样式表
 --username <username>             HTTP身份验证用户名
 --viewport-size <>                如果有自定义滚动条或css属性溢出来模拟窗口大小,请设置视口大小
--window-status <windowStatus>     等到窗户。在呈现页面之前,状态等于此字符串
--zoom <float>                     使用此缩放因子(默认为1)
页眉和页脚选项-------------------------------------------------------------------------
--footer-center <text>             居中的页脚文本
--footer-font-name <name>          设置页脚字体名称(默认为Arial)
--footer-font-size <size>          设置页脚字体大小(默认为12)
--footer-html <url>                添加一个html页脚
--footer-left <text>               左对齐页脚文本
--footer-line                      在页脚上方显示行
--no-footer-line                   不在页脚上方显示行(默认)
--footer-right <text>              右对齐的页脚文本
--footer-spacing <real>            页脚和内容之间的间距(mm)(默认值为0)
--header-center <text>             居中标题文本
--header-font-name <name>          设置标题字体名称(默认为Arial)
--header-font-size <size>          设置页眉字体大小(默认为12)
--header-html <url>                添加一个html标题
--header-left <text>               左对齐标题文本
--header-line                      标题下方的显示行
--no-header-line                   无标题行不显示标题下方的行(默认)
--header-right <text>              右对齐标题文本
--header-spacing <real>            标题和内容之间的间距(mm)(默认为0)
--replace <name> <value>           将[name]替换为页眉和页脚中的值(可重复)
TOC选项--------------------------------------------------------------------------------**
--disable-dotted-lines             不要在toc中使用虚线
--toc-header-text <text>           toc的标题文本(默认目录)
--toc-level-indentation <width>    对于toc中的每一级标题,按此长度缩进(默认为1em)
--disable-toc-links                不要从toc链接到章节
--toc-text-size-shrink <real>      对于toc中的每一级标题,字体按此系数缩放(默认值为0.8)
--xsl-style-sheet <file>           使用提供的xsl样式表打印目录