Hugo 与 Docker 入门
了解如何使用 Docker 容器搭建 Hugo 静态网站,无需在本地安装任何东西!这份分步指南将演示如何在隔离、可复现的环境中创建、开发和构建 Hugo 网站。

Docker 容器
从 Docker Hub 拉取 Docker 容器:
docker pull registry.gitlab.com/pages/hugo/hugo_extended:latest
标签
为方便起见,我们来创建一个别名(标签),这样就不必在每条 Docker 命令中都写完整的 URL 了。
docker tag registry.gitlab.com/pages/hugo/hugo_extended:latest hugo_extended
更多信息请参阅 docker tag。
创建新网站
现在可以开始使用 Hugo 容器创建新网站了:
docker run --rm -v ${PWD}:/src hugo_extended hugo new site quickstart
docker run让 Docker 运行(创建一个新容器)--rm告诉 Docker 在容器执行完毕后将其清理掉。-v ${PWD}:/src将宿主机上的当前目录挂载到 Hugo 容器内的/site目录。hugo_extended是我们之前拉取的 Hugo 容器。hugo new site <site_name>执行 Hugo 的new site子命令。Hugo 容器已将hugo命令定义为容器的主入口点。最后一个参数是我们要创建的网站名称。
执行上述命令后,你会看到:
Congratulations! Your new Hugo site is created in /src/quickstart.
Just a few more steps and you're ready to go:
1. Download a theme into the same-named folder.
Choose a theme from https://themes.gohugo.io/ or
create your own with the "hugo new theme <THEMENAME>" command.
2. Perhaps you want to add some content. You can add single files
with "hugo new <SECTIONNAME>/<FILENAME>.<FORMAT>".
3. Start the built-in live server via "hugo server".
Visit https://gohugo.io/ for quickstart guide and full documentation.
我们是在容器内执行 Hugo 的,宿主机上并没有安装 Hugo。
由于我们挂载了卷,运行
hugo new site生成的文件(或产物)在容器销毁后依然保留在宿主机上,可以继续使用。
添加主题
在添加主题之前,我们先把它当作一个真正的项目来对待:
cd quickstart
git init
git add .
git commit -m "initial commit"
有了 git 仓库之后,就可以通过子模块添加主题了:
git submodule add https://github.com/calintat/minimal.git themes/minimal
git submodule init
git submodule update
echo 'theme = "minimal"' >> config.toml
如果不喜欢这个主题,可以随时浏览 https://themes.gohugo.io/ 寻找更多主题。
现在可以通过以下命令启动网站:
docker run --rm -v ${PWD}:/src -p 1313:1313 hugo_extended hugo server --bind 0.0.0.0
docker run让 Docker 运行(创建一个新容器)--rm告诉 Docker 在容器执行完毕后将其清理掉。-v ${PWD}:/src将宿主机上的当前目录挂载到 Hugo 容器内的/src目录。-p 1313:1313将宿主机的 1313 端口转发到容器的 1313 端口hugo_extended是我们之前拉取的 Hugo 容器。hugo server --bind 0.0.0.0执行hugo server子命令。在容器中运行时必须加上额外的 bind 选项,否则无法在本地浏览器中打开网站。
你会看到类似以下的输出:
| EN
+------------------+----+
Pages | 7
Paginator pages | 0
Non-page files | 0
Static files | 3
Processed images | 0
Aliases | 0
Sitemaps | 1
Cleaned | 0
Total in 42 ms
Watching for changes in /src/{content,data,layouts,static,themes}
Watching for config changes in /src/config.toml
Serving pages from memory
Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
Web Server is available at http://localhost:1313/ (bind address 0.0.0.0)
Press Ctrl+C to stop
打开浏览器并访问 http://localhost:1313。
浏览完毕后,在终端中按 Ctrl+C 停止正在运行的 Hugo Docker 容器。
提交更改
git add .
git commit -m "add theme submodule"
使用 Docker Compose 简化流程
Docker Compose 为我们提供了一种机制,可以减少命令输入,并一次性启动所需的一切。本例中只有一个服务,但想象一下,如果还需要数据库、日志服务、键值存储服务和 API 服务呢?只需运行一条命令就能让整个系统准备就绪、直接上手,这要舒服得多。
另一个原因在于持续集成和持续部署。你经常会听到很多人说用 Docker 来保持各环境之间的一致性:开发环境中运行的内容与集成、预发布和生产环境完全相同,只是配置有所差异。这固然没错,但 Docker Compose 另一个强大之处在于它提供了一套可组合的部署命令。后文会详细介绍。
在项目根目录下创建一个 docker-compose.yml,内容如下:
version: "3"
services:
hugo:
image: registry.gitlab.com/pages/hugo/hugo_extended:latest
working_dir: /src
ports:
- "1313:1313"
volumes:
- ".:/src"
command: server --bind 0.0.0.0
启动 Hugo
docker-compose up -d hugo
打开浏览器并访问 http://localhost:1313。
提交更改
git add .
git commit -m "add docker-compose"