本文使用「署名 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
衆所周知 GitBook 新版本生成的 PDF 是調用 calibre
的 ebook-convert
模塊進行電子書生成的,而它默認生成的 PDF 尺寸比較大,並且不支持壓縮,很是不利於傳播。linux
通過簡單的尋找,我看到 fuergaosi233 同窗用 Python 基於 weastprint 編寫了一個簡單的 GitBook PDF 生成工具,使用下來感受還不錯,因而就封裝了這個容器鏡像,但願可以幫助到有一樣需求的你。git
本文將聊聊如何封裝簡單的 Python 應用爲 Docker 工具鏡像,並使用它生成 PDF 文件,操做時間在十分鐘內。github
完整的項目代碼,我已經上傳到:github.com/soulteary/d…,有定製需求的同窗能夠自取。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" ]
複製代碼
從上面能夠看出,封裝邏輯也十分簡單:
若是咱們在服務端構建,由於多數服務器具有良好的網絡條件,可以快速的獲得結果。但若是咱們選擇在本地構建,網絡條件沒有那麼好的時候,咱們訪問 alpine
、python 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、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。
喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)