Соберем свой локальный docker контейнер для написания заметок сюда, на этот сайт.

Предыстория

С некоторых пор hugo тема PaperMod, которая используется здесь, обновилась. Поднялись требования по минимальной версии hugo. Но так уж вышло, что доступная из репозитория версия hugo оказалась ниже.

1
2
❯ dnf list installed | grep hugo
hugo.x86_64     0.111.3-4.fc39      @fedora

При попытке запустить дев сервер получаю сообщение:

1
2
3
4
5
❯ hugo serve
WARN 2024/01/27 19:50:57 Module "PaperMod" is not compatible with this Hugo version; run "hugo mod graph" for more information.
Start building sites … 
hugo v0.111.3+extended linux/amd64 BuildDate=2023-07-26T00:00:00+00:00 VendorInfo=Fedora:0.111.3-4.fc39
ERROR 2024/01/27 19:50:57 => hugo v0.112.4 or greater is required for hugo-PaperMod to build 

Повезло что в alpine версия посвежее и подойдет. Благодаря этому не отвалилась сборка сайта в GitLab CI.

Варианты решения

Вариантов решения на самом деле несколько:

Просто скачать

Способ максимально простой, можно даже добавить этот бинарник в .gitignore, что бы не “утяжелять” репозиторий. Но тут есть минус с обновлением, нужно либо писать скрипт, который будет уметь выкачивать этот бинарник (желательно учитывая версию hugo). Если со скриптом возиться не хочется, можно руками скачивать временами. Но этот процесс не интересен и слишком “ручной”.

Компилировать локально

Так как у меня уже есть локально установленный golang пакет, то можно настроить сборку локально. Положить потом этот бинарник в $PATH. Но процесс обновления тоже будет не “однокнопочным”. Тоже понадобиться скрипт, что бы определять последнюю стабильную версию, выкачивать/переключаться на ее коммит, собирать и раскладывать скомпилированные бинарники. При этом нет никакой гарантии, что со временем процесс сборки не поменяется, или не добавятся доп зависимости от сторонних пакетов.

Взять готовый docker образ

Тут все больше опирается в то, что образ это собирается “кем-то”. В общем вопрос доверия. Ну и нет никакой уверенности, что человек как-нибудь не передаст проект в “слишком хорошие руки” или просто устанет.

Собрать свой локальный docker образ

Так как для hugo нет официального образа на hub.docker.io, то придется идти тем же путем, что и в статье про GitLab CI. Это даст дополнительный плюс, перед первыми тремя вариантами: не нужно отслеживать соответствие версий пакета hugo локально и в CI. То есть получится сделать унификацию окружения, ведь и там и там одинаковый базовый образ и одинаковый репозиторий пакетов.

Dockerfile

Так как нам нужно унифицироваться с окружением CI, нужен только “голый” hugo, то файл получается максимально простым:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
FROM alpine:3

VOLUME /data
WORKDIR /data

EXPOSE 1313

RUN apk add --update --no-cache hugo

ENTRYPOINT ["hugo"]
CMD ["server", "-D", "--disableFastRender", "--navigateToChanged", "--noBuildLock", "--bind=0.0.0.0"]

Пойдем по порядку, и первым делом устанавливаем VOLUME, WORKDIR и EXPOSE. Эти параметры не будут меняться в обозримом будущем и стоит их поместить ближе к началу. В ENTRYPOINT указываем hugo, именно в квадратных скобках, что бы запускать его в режиме exec(почитать в документации).

Вообще как работают ENTRYPOINT и CMD сейчас останется за рамками этой заметки. Набор флагов выбран такой:

  • server - это в общем-то http сервер для разработки, он будет работать на порту 1313 (его то и указали в EXPOSE);
  • -D - для показа черновиков;
  • --disableFastRender - полная перерисовка сайта при изменениях;
  • --navigateToChanged - переход на страницу, где было изменение;
  • --noBuildLock - не создавать файл .hugo_build.lock, так как все будет работать в памяти, а файловая структура будет монтироваться в режиме только для чтения;
  • --bind=0.0.0.0 - внутри docker-а без этой настройки доступа к серверу по http не будет.

Полный список параметров посмотреть тут.

Запуск

Теперь для запуска сервера нужно лишь выполнить команду:

1
docker build -t spwsmr.website:hugo . && docker run -p 1313:1313 -v $(pwd):/data:ro --name spwsmr.website.hugo spwsmr.website:hugo

После этого открыть ссылку http://localhost:1313/ в браузере.

PhpStorm

Для PhpStorm эту команду можно свести к нажатию одной кнопки. Для этого создать новую конфигурацию запуска: phpstorm-run-config.png