Help us understand the problem. What is going on with this article?

Hugo が動く最小構成の Docker イメージを作る

Hugo や Hugo extended が動作する Docker image の作成方法について知見をまとめます。

Hugo の Docker image

現在 Hugo 公式 (gohugoio) が提供する Docker image はありません。

Docker Hub に gohugoio のアカウントがありますが、あれは GoHugoIO が管理しているものではありません。

手っ取り早く Hugo の Docker image が欲しい方は私が管理しているものを良かったら使ってください。新しいリリースがあればその日のうちに更新するようにしています。

CircleCI や GitLab CI/CD で使いたい場合は以下のイメージをどうぞ。

以下のリポジトリも色々なイメージを取り揃えていて便利です。

GitHub Actions は以下をどうぞ。

Dockerfile の例

以下に Hugo extended が動作する最小構成の Dockerfile を示します。最新のものは hugo-extended-docker/Dockerfile を確認してください。

FROM alpine:3.10

ENV HUGO_VERSION='0.59.0'
ENV HUGO_NAME="hugo_extended_${HUGO_VERSION}_Linux-64bit"
ENV HUGO_BASE_URL="https://github.com/gohugoio/hugo/releases/download"
ENV HUGO_URL="${HUGO_BASE_URL}/v${HUGO_VERSION}/${HUGO_NAME}.tar.gz"
ENV HUGO_CHECKSUM_URL="${HUGO_BASE_URL}/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_checksums.txt"

WORKDIR /hugo
SHELL ["/bin/ash", "-eo", "pipefail", "-c"]
RUN apk add --no-cache --virtual .build-deps wget && \
    apk add --no-cache \
    git \
    ca-certificates \
    libc6-compat \
    libstdc++ && \
    wget --quiet "${HUGO_URL}" && \
    wget --quiet "${HUGO_CHECKSUM_URL}" && \
    grep "${HUGO_NAME}.tar.gz" "./hugo_${HUGO_VERSION}_checksums.txt" | sha256sum -c - && \
    tar -zxvf "${HUGO_NAME}.tar.gz" && \
    mv ./hugo /usr/bin/hugo && \
    apk del .build-deps && \
    rm -rf /hugo

WORKDIR /src
ENTRYPOINT [ "/usr/bin/hugo" ]

docker build して docker image ls で image size を確認すると 64MB だと分かります。

extended を実行するために libc6-compatlibstdc++ が必要です。

Hugo Modules の機能を利用したい場合は base image を golang:1.13-alpine3.10 に変更してください。

このイメージの使い方を以下に示します。

# Pull Docker image
docker pull peaceiris/hugo:v0.59.0

# Run `hugo version`
docker run --rm -i -t hugo:v0.59.0 version

# Build site
docker run --rm -i -t -v ${PWD}:/src peaceiris/hugo:v0.59.0

# Run `hugo server`
docker run --rm -i -t -v ${PWD}:/src -p 1313:1313 peaceiris/hugo:v0.59.0 server --bind=0.0.0.0

あとは docker-compose.ymlMakefile で上記を扱いやすくすると良いでしょう。Docker compose の例はリポジトリで紹介しているので参考にしてください。

なるべく Docker を避ける

ローカル環境で動作させる Hugo はなるべくバイナリのものを使うべきです。Install Hugo | Hugo を参考にして

  • macOS なら Homebrew
  • Linux なら Snap や Linuxbrew
  • Windows なら Chocolatey や Scoop

を使ってバイナリをダウンロードして使いましょう。もしくは Releases · gohugoio/hugo から直接ダウンロードもできます。

CI/CD でも手元のPCでも Hugo はバイナリのものが良いです。理由は以下の通りです。

イメージサイズが大きい

ただの Hugo を alpine 上で動かすのであれば 64MB くらいには収まります。ですが v0.56 から導入された Hugo Modules を使いたい場合には Golang が必要になり、たちまちイメージサイズが膨れ上がります。Hugo のすべての機能が使えるイメージを作ると 417MB くらいになります。

この記事で言うところのイメージサイズは docker imagesdocker image ls で確認できる容量のことです。

Hugo on Docker の使いどころ

バイナリ Hugo をオススメしましたが、

  • Version を固定したい
  • チームで同じ Version を共有したい
  • 複数 Version を共存させたい

のような場面では Docker が便利だと思います。

Hugo の依存

最近の Hugo は連携できる外部ツールも増えて、すべての機能を利用する場合にはイメージサイズを小さくすることが難しくなりました。

Git

Lastmod などを使ってコミットから情報を得るには Git がインストールされている必要があります。まぁ Git くらいならサイズは気にならないでしょう。

glibc

Hugo には SASS/SCSS のトランスコンパイルができる Hugo extended version が存在します。その Hugo extended が動作する alpine ベースの Docker image を作るには glibc を含める必要があります。

Hugo Modules

v0.56 から導入された Hugo Modules は Go Modules と Git に依存しています。従って Hugo Modules が利用できる Docker image にはGo言語の環境を含めなければなりません。この時点でイメージサイズは alpine 系でも 417MB 近くになります。

Node.js

autoprefixer, postcss-cli, babel などと連携させるには必要になります。

Ruby

asciidoctor と連携したい場合に必要になります。

peaceiris
Hugo ʕ◔ϖ◔ʔ や GitHub Actions について書いています。こっち https://peaceiris.com/ に引っ越しましたので、今後 Qiita への新規投稿はしませんが記事のメンテはします。
https://peaceiris.com/
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。
https://admin-guild.slack.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away