Hugo 是一款流行的靜態網站生成器,而 PaperMod 是其中一個廣受歡迎的主題。然而,在本地機器上安裝 Hugo 和各種依賴可能會造成環境污染。本文將介紹如何使用 Docker 容器技術,在完全隔離的環境中運行 Hugo 與 PaperMod 主題,無需在宿主機上安裝任何依賴。

前置需求

  • 已安裝 Docker 和 Docker Compose
  • 基本的命令行操作能力

步驟 1: 創建項目目錄結構

首先,我們需要創建一個項目目錄,用於存放 Docker 相關配置和 Hugo 網站內容:

mkdir hugo-papermod-docker
cd hugo-papermod-docker

步驟 2: 創建 Dockerfile

在項目目錄中創建一個 Dockerfile,用於定義 Docker 映像:

FROM alpine:latest

# 安裝 Hugo、git 和其他必要工具
RUN apk add --no-cache hugo git curl bash

# 設置工作目錄
WORKDIR /site

# 設置環境變數
ENV HUGO_ENV=production

# 安裝 PaperMod 主題的腳本
COPY ./scripts/setup.sh /setup.sh
RUN chmod +x /setup.sh

# 暴露 Hugo 服務器端口
EXPOSE 1313

# 容器啟動命令
ENTRYPOINT ["/bin/bash", "/setup.sh"]

這個 Dockerfile 基於 Alpine Linux 映像,安裝了 Hugo 和必要的工具,並設置了容器啟動時執行的腳本。

步驟 3: 創建設置腳本

我們需要創建一個設置腳本,當容器啟動時自動初始化 Hugo 網站並安裝 PaperMod 主題:

mkdir -p scripts

創建 scripts/setup.sh 文件並添加以下內容:

#!/bin/bash

# 檢查 /site 目錄是否為空
if [ -z "$(ls -A /site)" ]; then
  echo "初始化新的 Hugo 站點..."
  hugo new site /site --force
  
  # 克隆 PaperMod 主題
  git clone https://github.com/adityatelange/hugo-PaperMod.git /site/themes/PaperMod
  
  # 創建基本配置
  cat > /site/config.yml << EOL
baseURL: "/"
title: "我的 PaperMod 博客"
theme: "PaperMod"
paginate: 5

params:
  assets:
    disableHLJS: false
  
  # 禁用外部資源
  googleFonts: false
  
  # 主題設定
  defaultTheme: auto
  disableThemeToggle: false
  
  # 首頁設定
  profileMode:
    enabled: true
    title: "PaperMod 博客"
    subtitle: "使用 Docker 建立的無依賴 Hugo 站點"

  # 社交圖標(本地圖標)
  socialIcons:
    - name: github
      url: "https://github.com/"
EOL

  # 創建示範文章
  mkdir -p /site/content/posts
  cat > /site/content/posts/first-post.md << EOL
---
title: "第一篇文章"
date: $(date +"%Y-%m-%dT%H:%M:%S+08:00")
draft: false
---

# 歡迎使用 Hugo PaperMod!

這是你的第一篇文章。你可以使用 Markdown 格式編寫內容。

## 特點

- 完全離線運行
- 使用 Docker 容器
- 無需在主機上安裝任何依賴
EOL

  echo "Hugo 站點已成功初始化!"
else
  echo "使用現有的 Hugo 站點..."
fi

# 啟動 Hugo 服務器
echo "啟動 Hugo 服務器..."
cd /site && hugo server --bind=0.0.0.0 --port=1313 --disableFastRender

這個腳本的功能是:

  • 檢查是否需要初始化新的 Hugo 站點
  • 安裝 PaperMod 主題
  • 創建基本配置和示例文章
  • 啟動 Hugo 服務器

記得設置腳本的執行權限:

chmod +x scripts/setup.sh

步驟 4: 創建 Docker Compose 配置

接下來,創建一個 docker-compose.yml 文件來簡化容器的管理:

version: '3'

services:
  hugo:
    build: .
    container_name: hugo-papermod
    ports:
      - "1313:1313"
    volumes:
      - ./site:/site
    restart: unless-stopped

此配置將:

  • 使用當前目錄的 Dockerfile 構建容器
  • 將容器命名為 hugo-papermod
  • 將容器的 1313 端口映射到宿主機的 1313 端口
  • 掛載 ./site 目錄到容器的 /site 目錄
  • 設置容器在意外停止時自動重啟

步驟 5: 構建和運行容器

現在,確保項目結構如下:

hugo-papermod-docker/
├── Dockerfile
├── docker-compose.yml
├── scripts/
│   └── setup.sh
└── site/    # 這個目錄會自動創建並掛載

運行以下命令來啟動項目:

docker-compose up -d

第一次運行時,Docker 會:

  1. 構建容器映像
  2. 初始化一個新的 Hugo 站點
  3. 安裝 PaperMod 主題
  4. 創建基本配置和示例文章
  5. 啟動 Hugo 服務器

步驟 6: 訪問你的網站

現在你可以通過瀏覽器訪問 http://localhost:1313 來查看你的網站。

步驟 7: 編輯內容

所有網站內容會保存在 ./site 目錄中。你可以直接編輯這些文件,容器中的 Hugo 服務器會自動檢測變更並刷新頁面。

要創建新文章,可以使用以下命令:

docker-compose exec hugo hugo new posts/新文章.md

日常使用命令

以下是一些常用的命令,方便你管理 Docker 容器和 Hugo 網站:

啟動服務

docker-compose up -d

停止服務

docker-compose down

查看日誌

docker-compose logs -f

創建新文章

docker-compose exec hugo hugo new posts/新文章.md

構建靜態網站

docker-compose exec hugo hugo --minify

構建完成後,靜態文件會生成在 ./site/public 目錄中。

優化配置

本地化所有資源

為了確保網站完全離線運行,可能需要對 PaperMod 主題進行一些修改,確保所有資源(包括字體、圖標等)都是本地的。

編輯 ./site/config.yml 文件,添加以下配置:

params:
  assets:
    disableHLJS: false
    favicon: "/favicon.ico"
    favicon16x16: "/favicon-16x16.png"
    favicon32x32: "/favicon-32x32.png"
    apple_touch_icon: "/apple-touch-icon.png"
  
  # 禁用 Google 字體
  googleFonts: false

自定義主題

要自定義 PaperMod 主題,可以在 ./site/assets 目錄中添加自己的 CSS 和 JS 文件,覆蓋主題的默認設置。

結論

透過使用 Docker 容器,我們成功地在本地機器上無依賴地運行了 Hugo 網站和 PaperMod 主題。這種方法的優點包括:

  • 不需要在本地機器上安裝 Hugo 或任何依賴
  • 環境完全隔離,不會影響宿主機系統
  • 易於遷移和分享項目
  • 可以輕鬆地在不同機器上重現相同的開發環境

希望這篇教程對你有所幫助!如果你有任何問題或建議,歡迎在下方留言。

參考資料