本文已参与「新人创作礼」活动,一起开启掘金创作之路。
简介
==项目实现解决== 本片主要讲述在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样式表打印目录