Hugo into Docker


Card image cap
Photo by Grovemade on Unsplash


This blog is publish with a docker image with GitLab. But I don’t like the image I was using because wasn’t update and it’s big and havy. So I fork the project for create an update version for my personal blog.

docker logo

So I started with updating the old docker image I was using this image

    FROM debian:wheezy
    MAINTAINER yigal@publysher.nl

    # Install pygments (for syntax highlighting)
    RUN apt-get -qq update \
    && DEBIAN_FRONTEND=noninteractive apt-get -qq install -y --no-install-recommends python-pygments git ca-certificates \
        && rm -rf /var/lib/apt/lists/*

    # Download and install hugo
    ENV HUGO_VERSION 0.20.6
    ENV HUGO_BINARY hugo_${HUGO_VERSION}-64bit.deb

    ADD https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY} /tmp/hugo.deb
    RUN dpkg -i /tmp/hugo.deb \
        && rm /tmp/hugo.deb

    # Create working directory
    RUN mkdir /usr/share/blog
    WORKDIR /usr/share/blog

    # Expose default hugo port
    EXPOSE 1313

    # Automatically build site
    ONBUILD ADD site/ /usr/share/blog
    ONBUILD RUN hugo -d /usr/share/nginx/html/

    # By default, serve site
    ENV HUGO_BASE_URL http://localhost:1313
    CMD hugo server -b ${HUGO_BASE_URL} --bind=0.0.0.0

So I build an image of this container and it was 171 MB in my machine.

But I can do better than this because i can use alpine in the place of debian:wheezy.

I do this because the image for debian is bigger than the image for alpine. But if I will use alpine I need to change somethings because I can’t install .deb into the image. So i use the binary of Hugo for Linux find on Github. And install it on the image

    FROM alpine
    LABEL maintainer "fundor333@gmail.com"

    # Download and install hugo
    ENV HUGO_VERSION 0.20.6
    ENV HUGO_DIRECTORY hugo_${HUGO_VERSION}_Linux-64bit
    ENV HUGO_BINARY ${HUGO_DIRECTORY}.tar.gz

    # Install HUGO
    RUN set -x
    RUN apk add --update wget ca-certificates
    RUN wget https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY}
    RUN tar xzf ${HUGO_BINARY}
    RUN rm -r ${HUGO_BINARY}
    RUN mv hugo /usr/bin/hugo
    RUN rm -r LICENSE.md
    RUN rm -r README.md
    RUN apk del wget ca-certificates
    RUN rm /var/cache/apk/*

    # Create working directory
    RUN mkdir /usr/share/blog
    WORKDIR /usr/share/blog

    # Expose default hugo port
    EXPOSE 1313

    # Automatically build site
    ONBUILD ADD site/ /usr/share/blog
    ONBUILD RUN hugo -d /usr/share/nginx/html/

    # By default, serve site
    ENV HUGO_BASE_URL http://localhost:1313
    CMD hugo server -b ${HUGO_BASE_URL} --bind=0.0.0.0

This time the size was 33,5 MB. Good but i can do BETTER.

Whenever you wrote a new line with RUN you make the “compiled” into another layer so, if you have 22 command (like me) you have 22 layer for the image

    FROM alpine
    LABEL maintainer "fundor333@gmail.com"

    # Download and install hugo
    ENV HUGO_VERSION 0.20.6
    ENV HUGO_DIRECTORY hugo_${HUGO_VERSION}_Linux-64bit
    ENV HUGO_BINARY ${HUGO_DIRECTORY}.tar.gz

    # Install HUGO
    RUN set -x && \
    apk add --update wget ca-certificates && \
    wget https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY} && \
    tar xzf ${HUGO_BINARY} && \
    rm -r ${HUGO_BINARY} && \
    mv hugo /usr/bin/hugo && \
    rm -r LICENSE.md && \
    rm -r README.md && \
    apk del wget ca-certificates && \
    rm /var/cache/apk/*

    # Create working directory
    RUN mkdir /usr/share/blog
    WORKDIR /usr/share/blog

    # Expose default hugo port
    EXPOSE 1313

    # Automatically build site
    ONBUILD ADD site/ /usr/share/blog
    ONBUILD RUN hugo -d /usr/share/nginx/html/

    # By default, serve site
    ENV HUGO_BASE_URL http://localhost:1313
    CMD hugo server -b ${HUGO_BASE_URL} --bind=0.0.0.0

Size 3,99 MB in this case.

The maggior part of the total size is caused by the size of the Hugo binary itself so I cann’t make an image lighter than the binary.

Now the image size and number layers can change update after update so I put this image with the allwayes data about the images.

hugo_fundor333

by Fundor 333


docker hugo image container docker

comments powered by Disqus