发布于 2026-01-06 7 阅读
0

使用 Docker 编译 Jekyll 项目,无需安装 Jekyll 或 Ruby。

使用 Docker 编译 Jekyll 项目,无需安装 Jekyll 或 Ruby。

我目前选择 Jekyll 作为网站运行框架,它是一个用 Ruby 编写的静态网站生成器。自从 2013 年放弃 WordPress 后,我就一直只使用 Jekyll。相比 WordPress,Jekyll 的搭建和运行要容易得多,但即便如此,在配置过程中仍然存在一些问题。

自 2013 年以来,我多次需要配置新电脑,这意味着要从头开始安装并运行 Jekyll。通常这意味着要先安装 Homebrew、rbenv、Ruby,然后再安装 Jekyll,最后祈祷一切顺利,一次成功。更不用说还要配置 Git,以便能够将代码提交到包含网站所有文件的 GitHub 仓库。

上周我重新开始研究 Docker。Docker 是一种技术,它允许你通过配置文件在容器中运行应用程序。这非常强大,因为它能让你避免开发者常说的“在我的电脑上运行正常”的谬论。

我发现使用 Docker 后,无需费劲地在本地机器上安装和运行 Jekyll,就可以在本地编译甚至运行我的 Jekyll 网站。虽然不需要安装任何 Jekyll 依赖项,但要运行 Docker,还是需要安装 Docker。不过,我发现这非常简单,因为他们提供了一个应用程序,其中包含了命令行界面 ( CLI)和设置工具。

使用 Docker 构建 Jekyll 项目

Docker安装并配置好后,您可以在项目文件夹内的命令行中运行以下命令来构建Jekyll项目。

docker run --rm -it --volume="$PWD:/srv/jekyll" --volume="$PWD/vendor/bundle:/usr/local/bundle" --env JEKYLL_ENV=production jekyll/jekyll:3.8 jekyll build
Enter fullscreen mode Exit fullscreen mode

这条命令的作用是:

  • --rm容器退出时自动移除该容器。
  • --volume="$PWD:/srv/jekyll"它获取当前目录(由指定)$PWD,并将其映射到容器内的指定目录/srv/jekyll,以便构建该目录。
  • --volume="$PWD/vendor/bundle:/usr/local/bundle"此选项会将当前目录的内容映射/vendor/bundle到目标目录/usr/local/bundle。这样做的目的是为了缓存 gems,以便在未来的构建中重复使用。
  • --env JEKYLL_ENV=production在我的 Jekyll 项目的各个部分,我都设置了仅在生产环境中渲染。例如,分析数据不应该受到本地开发环境的影响。这设置了环境变量JEKYLL_ENVproduction
  • jekyll/jekyll:3.8这告诉它使用jekyll:3.8已标记的Jekyll 容器版本。
  • jekyll build运行 Jekyll 的构建命令

如果您是第一次运行此命令,则此容器的镜像不会存在于您的系统中,因此它会先从 Docker 注册表中获取该镜像,然后再运行容器。

Unable to find image 'jekyll/jekyll:3.8' locally
3.8: Pulling from jekyll/jekyll
e7c96db7181b: Pull complete
622c94c90cb1: Pull complete
5ab26e9d8a17: Pull complete
830997f3d72a: Pull complete
1956a4eaab3f: Pull complete
36a9759f9f2f: Pull complete
Digest: sha256:deb267df3f6c2b7604b0d5a5aabcb394eec1452a053e4297cf2fb13b125e0bcf
Status: Downloaded newer image for jekyll/jekyll:3.8
Enter fullscreen mode Exit fullscreen mode

我遇到的一个问题是这样的警告:

Error: could not read file /srv/jekyll/vendor/bundle/gems/jekyll-3.8.5/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb: Invalid date '<%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %>': Document 'vendor/bundle/gems/jekyll-3.8.5/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb' does not have a valid date in the YAML front matter.
ERROR: YOUR SITE COULD NOT BE BUILT:
       ------------------------------------
       Invalid date '<%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %>': Document 'vendor/bundle/gems/jekyll-3.8.5/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb' does not have a valid date in the YAML front matter.
Enter fullscreen mode Exit fullscreen mode

为了解决这个问题,我需要修改项目_config.yml文件。如果你的项目中excluded定义了一个部分,请将vendor其添加到该部分中。

exclude:
  - "package.json"
  - "README.md"
  - "publish.sh"
  - "vendor"
Enter fullscreen mode Exit fullscreen mode

现在运行上面的命令应该可以正常工作了,你应该能在项目文件夹docker run内看到已经构建好的网站。如果你的项目已经进行了版本控制,最好现在就把这个文件夹添加到你的配置文件中。_sitegitvendor.gitignore

使用 Docker 运行您的 Jekyll 项目

如果您不想编译,而是想直接运行您的 Jekyll 网站进行本地开发,您也可以使用 Docker 运行以下命令来实现:

docker run --rm --volume="$PWD:/srv/jekyll" --volume="$PWD/vendor/bundle:/usr/local/bundle" --env JEKYLL_ENV=development -p 4000:4000 jekyll/jekyll:3.8 jekyll serve
Enter fullscreen mode Exit fullscreen mode

serve该命令与上述命令的唯一区别build在于,我向其传递了一个环境变量JEKYLL_ENV=development,正如我提到的,这是因为我的网站的某些部分被设置为仅在生产环境中构建。

运行上述命令后,您将看到与在本地计算机上安装 Jekyll 时相同的输出。

ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux-musl]
Configuration file: /srv/jekyll/_config.yml
            Source: /srv/jekyll
       Destination: /srv/jekyll/_site
 Incremental build: disabled. Enable with --incremental
      Generating... 
                    done in 19.698 seconds.
 Auto-regeneration: enabled for '/srv/jekyll'
    Server address: http://0.0.0.0:4000/
  Server running... press ctrl-c to stop.
Enter fullscreen mode Exit fullscreen mode

唯一的区别是,现在您的 Jekyll 项目是由 Docker 容器生成和提供的,您可以将浏览器指向localhost:4000并查看 Docker 提供的站点。

———-

感谢您抽出时间阅读本文!我很乐意通过我的电子报向您发送更多编程技巧。点击此处订阅

文章来源:https://dev.to/michael/compile-a-jekyll-project-without-installing-jekyll-or-ruby-by-using-docker-4184