Docker中的Hugo

Hugo的安装

其实,Hugo的安装并不麻烦,尤其是在Mac上。

brew install hugo

HomeBrew的一个特点,是保持更新。 在其它环境下,想要获取最新发布的Hugo,就没那么容易了。 需要先去Hugo的Releases,查找对应的发布包,然后下载、安装。

问题往往出现在下载上。 由于GitHub的Releases,是托管在AWS上的,而中国又有众所周知的网络问题, 于是在下载稍大的文件时,会出现概率性的失败。

于是,孤就有了制作一个Docker镜像的想法。

Docker镜像

只是孤第二次发布Docker镜像,上次是GitBook

Hugo是Golang写的,并且官方Releases的发布包也很齐全。 孤没有选择从源码编译,而是直接下载安装。 由于是Docker Hub自动编译,所以避免了中国区特有的网络问题。

在镜像的最后,使用hugo server来作为Docker容器持续运行的进程。

思路就是这么简单,制作过程也比较顺利。 最终,发布于此——yanqd0/hugo

Dockerfile

最新Dockerfile,见Docker Hub上的相关页面。 以下展示第一版初稿,当时用的还是Hugo的0.23版本。

FROM alpine:3.6

MAINTAINER Yan QiDong <yanqd0@outlook.com>

ENV HUGO_VERSION=0.23 \
    HUGO_USER=hugo \
    HUGO_SITE=/srv/hugo

ENV HUGO_URL=https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_Linux-64bit.tar.gz

ADD ${HUGO_URL} /tmp/

RUN tar -xzf /tmp/*.tar.gz -C /tmp \
    && mv /tmp/hugo /usr/local/bin/ \
    && rm -rf /tmp/* \
    && adduser ${HUGO_USER} -D

USER ${HUGO_USER}

WORKDIR ${HUGO_SITE}

VOLUME ${HUGO_SITE}

EXPOSE 1313

CMD ["hugo", "server", "--bind", "0.0.0.0"]

敬请欣赏,不多解释。

只是下载或更新的话,使用docker pull yanqd0/hugo即可。

使用docker-compose

在Hugo项目的根目录,放一个docker-compose.yml文件。 然后就可以通过简单的docker-compose up,在任意环境中把Hugo跑在1313端口。

version: '3'

services:
  hugo:
    image: yanqd0/hugo
    volumes:
      - .:/srv/hugo
    ports:
      - 1313:1313

然而,这里有一个失策。

Hugo是一个静态网站生成器,hugo server只是一个调试用的方式。

Hugo provides its own webserver which builds and serves the site. While hugo server is high performance, it is a webserver with limited options. Many run it in production, but the standard behavior is for people to use it in development and use a more full featured server such as Nginx or Caddy.

hugo server will avoid writing the rendered and served content to disk, preferring to store it in memory.

所以,生产环境下要另外想办法。

使用docker run

利用Docker,来执行静态网站生成命令,也是可行的。

#!/usr/bin/env bash

docker run --rm -v ${PWD}:/srv/hugo yanqd0/hugo hugo

缺点

Docker的优点,是环境干净。 而孤为了制作最小镜像,没有安装Git,没有安装Pygments…… 导致hugo本身的功能受到限制。


相关笔记