使用 Docker 封裝 Python 小工具生成 GitBook PDF
本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要註明來源。 署名 4.0 國際 (CC BY 4.0)
本文作者: 蘇洋
創建時間: 2019年05月07日 統計字數: 3277字 閱讀時間: 7分鐘閱讀 本文鏈接: https://soulteary.com/2019/05/07/generate-small-gitbook-pdf-using-the-docker-with-python.html
使用 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:/usr/share/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
我現在有一個小小的折騰羣,裡面聚集了一些喜歡折騰的小夥伴。
在不發廣告的情況下,我們在裡面會一起聊聊軟體、HomeLab、編程上的一些問題,也會在羣裏不定期的分享一些技術沙龍的資料。
喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,否則不會通過審核)
蘇洋:關於折騰羣入羣的那些事推薦閱讀: