使用 Docker 封裝 Python 小工具生成 GitBook PDF

蘇洋發表於2019-05-07

本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要註明來源。 署名 4.0 國際 (CC BY 4.0)

本文作者: 蘇洋

建立時間: 2019年05月07日 統計字數: 3277字 閱讀時間: 7分鐘閱讀 本文連結: soulteary.com/2019/05/07/…


使用 Docker 封裝 Python 小工具生成 GitBook PDF

眾所周知 GitBook 新版本生成的 PDF 是呼叫 calibreebook-convert 模組進行電子書生成的,而它預設生成的 PDF 尺寸比較大,而且不支援壓縮,非常不利於傳播。

經過簡單的尋找,我看到 fuergaosi233 同學用 Python 基於 weastprint 編寫了一個簡單的 GitBook PDF 生成工具,使用下來感覺還不錯,於是就封裝了這個容器映象,希望能夠幫助到有同樣需求的你。

本文將聊聊如何封裝簡單的 Python 應用為 Docker 工具映象,並使用它生成 PDF 檔案,操作時間在十分鐘內。

完整的專案程式碼,我已經上傳到:github.com/soulteary/d…,有定製需求的同學可以自取。

前置準備

在開始使用之前,你需要準備兩個東西。

  • Docker
  • 你喜歡的字型檔案(如果需要傳播生成的電子書,注意版權風險哦)
    • 比如:蘋方、思源、…

安裝好容器環境,準備好字型之後,我們就可以進行容器封裝了,如果你不關注封裝細節,只是想使用,可以自行跳轉“使用方法”小節。

封裝容器

因為我們使用的電子書生成工具是由 Python 編寫,為了更快的封裝(不折騰 pip 這些基礎工具),所以我使用了相對小巧的 python:3.7-alpine3.9 基礎映象,封裝命令很簡單,只需要十行左右。

FROM python:3.7-alpine3.9
LABEL  MAINTAINER="soulteary <soulteary@gmail.com>"

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了原作者的倉庫)
  • 安裝編譯依賴、專案執行依賴後,下載專案依賴包,並執行編譯,然後清理掉不再使用的編譯依賴
  • 宣告可以掛載的檔案位置,切換工作目錄,宣告容器入口點(預設執行命令)

如果我們在服務端構建,因為多數伺服器具備良好的網路條件,能夠快速的得到結果。但如果我們選擇在本地構建,網路條件沒有那麼好的時候,我們訪問 alpinepython pip 軟體源速度不佳,構建映象的速度將極其緩慢。

這個時候,可以使用 Mirror 來對構建進行加速,上面的構建命令可以改為下面這樣:

FROM python:3.7-alpine3.9
LABEL  MAINTAINER="soulteary <soulteary@gmail.com>"

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


我現在有一個小小的折騰群,裡面聚集了一些喜歡折騰的小夥伴。

在不發廣告的情況下,我們在裡面會一起聊聊軟體、HomeLab、程式設計上的一些問題,也會在群裡不定期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼新增好友。(請註明來源和目的,否則不會通過稽核)

關於折騰群入群的那些事

相關文章