使用 Docker 封裝 Python 小工具生成 GitBook PDF
眾所周知 GitBook 新版本生成的 PDF 是呼叫calibre
的ebook-convert
模組進行電子書生成的,而它預設生成的 PDF 尺寸比較大,而且不支援壓縮,非常不利於傳播。
經過簡單的尋找,我看到 fuergaosi233 同學用 Python 基於 weastprint 編寫了一個簡單的 GitBook PDF 生成工具,使用下來感覺還不錯,於是就封裝了這個容器映象,希望能夠幫助到有同樣需求的你。
本文將聊聊如何封裝簡單的 Python 應用為 Docker 工具映象,並使用它生成 PDF 檔案,操作時間在十分鐘內。
完整的專案程式碼,我已經上傳到:https://github.com/soulteary/docker-gitbook-pdf-generator ,有定製需求的同學可以自取。
前置準備
在開始使用之前,你需要準備兩個東西。
- Docker
-
你喜歡的字型檔案(如果需要傳播生成的電子書,注意版權風險哦)
- 比如:蘋方、思源、…
安裝好容器環境,準備好字型之後,我們就可以進行容器封裝了,如果你不關注封裝細節,只是想使用,可以自行跳轉“使用方法”小節。
封裝容器
因為我們使用的電子書生成工具是由 Python 編寫,為了更快的封裝(不折騰 pip 這些基礎工具),所以我使用了相對小巧的python:3.7-alpine3.9
基礎映象,封裝命令很簡單,只需要十行左右。
FROM python:3.7-alpine3.9 LABEL MAINTAINER="soulteary <[email protected]>" ENV LIBRARY_PATH /lib:/usr/lib RUN wget https://github.com/soulteary/gitbook2pdf/archive/master.zip -O /tmp/app.zip && \ cd /tmp && unzip app.zip && mv /tmp/gitbook2pdf-master /app RUN apk add build-base python3-dev gcc musl-dev jpeg-dev zlib-dev libffi-dev cairo-dev pango-dev gdk-pixbuf-dev libxslt-dev && \ cd /app && pip install -r /app/requirements.txt && \ apk del build-base && rm -rf /var/cache/apk/* VOLUME [ "/app/output" ] VOLUME [ "/usr/share/fonts/" ] WORKDIR /app ENTRYPOINT [ "python", "/app/gitbook.py" ]
從上面可以看出,封裝邏輯也十分簡單:
- 下載程式碼(為了防後續有break change,我fork了原作者的倉庫)
- 安裝編譯依賴、專案執行依賴後,下載專案依賴包,並執行編譯,然後清理掉不再使用的編譯依賴
- 宣告可以掛載的檔案位置,切換工作目錄,宣告容器入口點(預設執行命令)
如果我們在服務端構建,因為多數伺服器具備良好的網路條件,能夠快速的得到結果。但如果我們選擇在本地構建,網路條件沒有那麼好的時候,我們訪問alpine
、python pip
軟體源速度不佳,構建映象的速度將極其緩慢。
這個時候,可以使用 Mirror 來對構建進行加速,上面的構建命令可以改為下面這樣:
FROM python:3.7-alpine3.9 LABEL MAINTAINER="soulteary <[email protected]>" ENV LIBRARY_PATH /lib:/usr/lib RUN wget https://github.com/soulteary/gitbook2pdf/archive/master.zip -O /tmp/app.zip && \ cd /tmp && unzip app.zip && mv /tmp/gitbook2pdf-master /app RUN cat /etc/apk/repositories | sed -e "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/" | tee /etc/apk/repositories && \ apk add build-base python3-dev gcc musl-dev jpeg-dev zlib-dev libffi-dev cairo-dev pango-dev gdk-pixbuf-dev libxslt-dev && \ cd /app && pip install -i https://mirrors.aliyun.com/pypi/simple/ -r /app/requirements.txt && \ apk del build-base && rm -rf /var/cache/apk/* VOLUME [ "/app/output" ] VOLUME [ "/usr/share/fonts/" ] WORKDIR /app ENTRYPOINT [ "python", "/app/gitbook.py" ]
當然,你也可以根據自己的實際狀況,將上面的阿里雲的軟體源替換為清華源、或者自己的源,獲取更快的構建體驗。
將上面的內容儲存為Dockerfile
,然後執行docker build -t gitbook .
,喝口水、刷刷網站,不一會這個工具映象就構建完成啦。
接下來,我們來聊聊使用。
使用方法
我們在當前目錄建立一個名為fonts
的資料夾,然後把早已準備好的字型內容放進去,如果不這樣做的話,我們生成的電子書將會因為字型缺失而展示一堆“口口口”。
接著你可以選擇使用我們上文自己構建好的映象,或者我為你準備好的映象開始電子書的生成操作了。
比如我們要將http://self-publishing.ebookchain.org
的網頁內容轉換為電子書,只需要執行下面的命令:
docker run --rm -v `pwd`/fonts:/app/fonts \ -v `pwd`/output:/app/output \ soulteary/docker-gitbook-pdf-generator "http://self-publishing.ebookchain.org"
如果你在上一步自己構建了容器映象,命令中的soulteary/docker-gitbook-pdf-generator
可以替換為gitbook
。
稍等片刻,你將會看到日誌提示:
crawl : all done! Generating pdf,please wait patiently Generated
與此同時,你當前目錄會自動多出一個名為 output 的新目錄,而我們想生成的電子書已經安靜的躺在裡面啦。
如果你覺得上面這條命令太過複雜,更喜歡使用docker-compose
來簡化操作,可以使用下面的配置:
version: '2' services: pdf-generator: image: soulteary/docker-gitbook-pdf-generator volumes: - ./output:/app/output:rw - ./fonts/:/usr/share/fonts:ro # 下面的URL替換為你想生成電子書的地址即可 command: "http://self-publishing.ebookchain.org"
將上面的內容儲存為docker-compose.yml
,然後執行docker-compose up
等待電子書生成完畢即可。
其他
如果你對生成電子書的樣式有額外定製需求,可以使用檔案掛載的方式修改/app/gitbook.css
樣式檔案。
感謝 fuergaosi233 同學的開源專案,他的專案還有幾個 todo 沒有完成,如果你感興趣,可以給他提 PR ,讓工具變的更好用。
先寫到這裡啦。
—EOF