Jekyll Docker迁移笔记
2017-06-26 小文字前言
在很久以前,出于便捷性,用jekyll搭建了静态博客,并从博客园迁移至此;在使用的这几年中也陆续遇到过一些问题,大部分是由于jekyll版本兼容和依赖库变更,导致编译失败; 因此有了今天的迁移到Docker
Docker
Docker其实已经火了挺久了,但是一直觉得用不着,所以也就没有过多了解,最近通过Docker的官方介绍,产生了利用Docker环境来解决jekyll的潜在编译问题;
我们的目标是,希望维持Jekyll的简洁性,希望环境问题再也不干扰博客的编写,从目前来看,采用Docker配置环境可以解决如下问题:
- Jekyll的2.x和3.x差异
- macOS的版本差异,比如默认ruby的安装目录和权限问题
- 使用环境统一
Jekyll Docker
简单Google以下可以发现Jekyll官方也推出了Jekyll Docker镜像,那么直接按照操作指南依葫芦画瓢就可以了吧;
可惜现实比没有那么顺利,首先Jekyll 的说明非常少,而且不明确;
默认提供了三个版本的镜像,分别是Standard,Builder以及Minimal,看了下解释,大概是依赖关系不同,标准版会附带很多依赖包,Minmal是精简版,那么是不是任意一个版本都可以呢?
我们试着运行了其中的minimal,指令如下:
实际结果并没有出现常规jekyll build之后的输出,所以感觉一定是哪里姿势不对,但是又找不到错在哪里。没办法只能从Docker 的入门开始,去了解如何启动一个docker进行,进而解决我们的启动本地站点。
Docker 入门
直接去查阅Docker的官方说明即可https://docs.docker.com/, 注意虽然也有国内的一些翻译版本,等各种资料,笔者还是建议读者要慎重选择翻译版本,主要是考虑到更新问题,国内的翻译资料一般很难保证变更的正确性,比如关于Docker的安装,在官网其实就介绍的比较多,比如Docker Toolbox和 Docker for Mac等等。 以macOS来说,现在安装和使用有一些不同,只需要同个Docker for Mac下载一个dmg安装,启动,就可以直接在终端运行docker命令,不需要再套一层machine了,所以这也引出另一个问题,这个后续再说。
文档比较多,一章章看完入门的介绍大致差不多可以再次动手了。
我们先来理解一下Jekyll Docker提供的命令,其中各参数段的含义:
-
export 这个不说也知道,是shell里面导出环境变量的,应为后面再指定版本时用的是这个方式,实际上,如果只直接执行命令,可以不用这么麻烦,如果是写成脚本的话导出确实更有可读性
- run 启动一个镜像
- –rm 和删除有点关系,表示的是结束后是不是clean up状态,我的理解做清理工作,有点类似于退出程序后清除所有文件
- -it 两个调试参数, 一般连在一起用,大致表示进入命令行交互输入输出的模式
- jekyll/minimal:$JEKYLL_VERSION 表示远程的镜像名称
- –volume=$PWD:/srv/jekyll 这句话含义比较多,首先–volume是挂载卷,比如把本地的主机目录挂载到docker下,用分号个开始的是两绝对个目录路径,前者是主机目录,后者是docker镜像实例中的目录。具体来说这个是把当前目录用pwd命令输出,并作为主机文件目录的挂载目标;而/srv/jekyll是一个预定义的目录,是jekyll/jekyll镜像内提前约定的一个文件位置;仅此而已;可以通过其Dockerfile配置源文件印证;
- jekyll build 最后是执行命令,编译得到静态站点
遇到的问题
好,我们理解了这里面的参数,那么到底怎么才能成功运行呢,笔者尝试了standard和minimal都没有成功;
这个提示很郁闷,但是笔者明确记得在另一台mac上相同配置是没有问题的;尝试清除Gemfile.lock,重新获取依赖关系;遇到了另一个问题,ruby访问太慢了,比蜗牛还夸张,因此,只能更换国内镜像:
换了镜像之后,速度上来了,但是任然有问题;只能把目光放到wiki上寻找答案;
也就是除了三个常规的镜像,还有一套pages,所以这成了我们新的尝试点,把版本号改成pages后,成功执行了bundle install没有错误提示,只是在jekyll serve时报了一个依赖库找不到,但实际上这个依赖库明明已经安装了;
由于我们到现在都是以-it的形式执行,出错后直接退出,导致也没办法看更多信息;
回想一下,既然docker是容器,安装了linux环境,那么应该是可以登录进去做操作的才对。
现在我们登录了docker容器实例,可以像正常使终端那样查看文件结构和安装的软件,先看一下刚才提示找不到的依赖包:
可以看到确实是安装了的,但是有两份,会不会是这个原因导致的?试着卸载其中的低版本
最后,在命令行下终于成功jekyll serve起来了。
小结
由于不熟悉Docker,在迁移过程中有很多细节都是很模糊的,好在docker的命令入门不难,还是要多加阅读;