wkhtmltopdf docker + java(环境搭建及一些坑)
起因
最近接到任务要把先去使用的word转pdf 切换成 html转pdf 当然这样先前的插件是不能用了就只能重新找一个
最后选到了这个wkhtmltopdf,起先在windows下感觉转换效果还是可以用起来也方便就开始着手代码方面,
由于公司项目都是用docker容器部署的,网上找的资料大多数都是用不到的最后终于找到个好使的搞定了wkhtmltopdf的环境
版权声明:本文为CSDN博主「Emmmmmm_m」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Emmmmmm_m/article/details/109611832
最近在处理docker容器化部署java+wkhtmltopdf服务的时候遇到了一些问题,翻遍了各种资料博客,要么就是解决不了核心问题的,要么就是不知道从哪儿复制来的毫无作用,自己研究了一下之后写个文记录下来。
首先说一下遇到的问题:在windows环境中开发的时候,直接在电脑上安装wkhtmltopdf后,使用java调用dos命令使用wkhtmltopdf的功能,没有任何问题,但是由于服务器环境是容器化部署,容器中没有wkhtmltopdf所以调用失败。
此前尝试过把宿主机的wkhtmltopdf安装目录挂载到容器中,但是由于wkhtmltopdf需要十多个依赖,找不到每个依赖的位置具体在哪里,所以暂时放弃了这个方案,选择另一个方案,在打镜像的时候就把wkhtmltopdf这个软件以及依赖全部打入,之后容器直接启动就可以了,也不用在宿主机上安装wkhtmltopdf了。
(如果宿主机账号不是root账号,请在所有docker命令前加 sudo )
1、准备基础镜像
拉取openjdk镜像:docker pull openjdk:8u252-jre
(openjdk:8u252-jre是基于Debian操作系统的镜像,以下在容器内的操作都是Debian的命令,如果使用基于其他操作系统的镜像,命令也要替换成对应的命令。)
启动openjdk容器并进入容器(退出时同时会关闭容器)
docker run -it --entrypoint bash openjdk:8u252-jre
容器中使用命令 cat /etc/debian_version 查看Debian操作系统版本
容器中使用命令 dpkg --print-architecture 查看当前操作系统位数
2、准备软件安装包
根据自己的系统版本和位数下载需要的软件版本
这里是在wkhtmltopdf官网下载的,官网行搜索,这里就不放链接了。
这里下载的是.deb安装包,由于容器内不能直接上传文件,所以我们在宿主机建一个文件夹挂载到刚才的容器中
(如果网络环境允许,也可以在宿主机中输入wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.buster_amd64.deb
直接将文件下载到当前目录)
先输入exit退出容器
在宿主机当前目录创建一个test文件夹:mkdir test
进入test目录:cd test
将刚刚下载好的文件上传到服务器test文件夹中:rz -E
重新启动openjdk容器并挂载test目录:
(如果test文件夹不在根目录下,需要修改-v后面的参数)
docker run -it --entrypoint bash -v /test:/test openjdk:8u252-jre
此时已经启动并进入openjdk容器
输入cd test 切换到容器内的test目录,输入ls可以看到.deb安装包已经被挂载进来了
3、安装软件
在容器内继续执行命令安装软件
dpkg -i wkhtmltox_0.12.6-1.buster_amd64.deb
中途如果需要别的依赖会报错
先更新一下源,依次在容器中执行
apt-get update
apt-get upgrade
再根据上面的提示在容器中输入apt --fix-broken install 来安装需要的依赖
经过漫长的等待后依赖终于装好了,在容器中输入wkhtmltopdf -V 看看软件是否装好,如果正确显示出版本号则已经安装完毕,否则重新执行
dpkg -i wkhtmltox_0.12.6-1.buster_amd64.deb
4、将容器打成镜像
然后我们回到宿主机环境,输入命令将这个安装了wkhtmltopdf的openjdk环境的容器打成镜像
docker commit 84073e79bb49 openjdk/wkhtmltopdf
(docker commit 容器id 镜像名称)
之后输入 docker images 能看到我们的镜像已经做好了
然后我们启动这个镜像,并进入其中,试试java命令和wkhtmltopdf命令是否都已经封装在镜像中
这里在容器中已经能正确识别出java命令以及wkhtmltopdf命令了
到此为止就已经把openjdk的基础镜像安装了一个软件并打包成新的镜像了,如果各位有单独的镜像仓库可以再执行第五步将其推入镜像仓库中。即使没有单独的镜像仓库,也可以在当前运行docker的主机上引用这个镜像来使用哦。
5、(附加)将镜像推入镜像仓库以备后续使用
Ok至此我们需要的软件已经基于openjdk做了一次封装,将这个镜像推入镜像仓库后,就可以在dockerfile文件中引用了。
dockerfile中第一行写入
FROM openjdk/wkhtmltopdf:latest 即可依赖这个镜像
接下来正常打包打镜像部署即可。
上述内容呢 是搭建一个带插件的jdk镜像
我是将这个镜像 传到 docker账号下的仓库然后代替openjdk进行项目的构建这样 容器内就带了插件并且能够正常使用(巧了以下操作又是搬的 专业搬运工)
1.上传自己的docker镜像 docker login #登录自己的docker hub账号 ,输入密码 #docker就会有你自己的dockerhub账号信息 yuchao163 2.更改docker镜像的名字,也就是加上一个tag标记 docker tag s14/centos-vim yuchao163/s14-centos-vim docker tag 现有镜像名字 dockerhub账户名/新的镜像名 3.登录后可以推送镜像文件,此时推送给的是自己的yuchao163账号仓库下 docker push yuchao163/s14-hello-docker
本来是想直接通过本地镜像构建但是不知道为啥都是报错说没有 所以才传到账号仓库再通过仓库进行构建这中间网络通信就有时候会出问题得多构建几次才能成功
使用的是dockerfile 构建项目所以只要from那 把之前的 openjdk 换成 上传的 镜像的名字 就可以正常构建了(容器部署方便就到这了 好像)
坑
看文档的时候是不是有很多的默认选项
比如图中这样的 巧了 到容器里执行他就不默认了 如果你发现你想要的效果没有达到 像我我的html是有图表的echarts 一直不显示 或者 用了本地的图片不把这些需要的配置再加到 转换语句里是 不能正常转换的
本地图片的话会报错
js这块他不生效
最后得把所谓的默认 也写上 pdf就转换正常了
就这些
2021-12-02 15:20:58
参考
wkhtmltopdf报错“Failed to load about:blank, with network status code 301 and http status code 0”
https://blog.csdn.net/bb276983381/article/details/112958566
dockerfile,仓库,私有仓库流程
https://www.cnblogs.com/bozhengheng/p/12186510.html