起因
最近接到任務要把先去使用的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