本文使用「署名 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、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。
喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核)