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

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

本文做者: 蘇洋html

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


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

衆所周知 GitBook 新版本生成的 PDF 是調用 calibreebook-convert 模塊進行電子書生成的,而它默認生成的 PDF 尺寸比較大,並且不支持壓縮,很是不利於傳播。linux

通過簡單的尋找,我看到 fuergaosi233 同窗用 Python 基於 weastprint 編寫了一個簡單的 GitBook PDF 生成工具,使用下來感受還不錯,因而就封裝了這個容器鏡像,但願可以幫助到有一樣需求的你。git

本文將聊聊如何封裝簡單的 Python 應用爲 Docker 工具鏡像,並使用它生成 PDF 文件,操做時間在十分鐘內。github

完整的項目代碼,我已經上傳到:github.com/soulteary/d…,有定製需求的同窗能夠自取。docker

前置準備

在開始使用以前,你須要準備兩個東西。編程

  • Docker
  • 你喜歡的字體文件(若是須要傳播生成的電子書,注意版權風險哦)
    • 好比:蘋方、思源、…

安裝好容器環境,準備好字體以後,咱們就能夠進行容器封裝了,若是你不關注封裝細節,只是想使用,能夠自行跳轉「使用方法」小節。bash

封裝容器

由於咱們使用的電子書生成工具是由 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:/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、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)

關於折騰羣入羣的那些事

相關文章
相關標籤/搜索