Hugo: сборка и публикация Docker образа
Содержание
Hugo — это генератор статических сайтов с открытым исходным кодом, написанный на Go, который позволяет быстро создавать, собирать и публиковать сайты и блоги из текстовых файлов (например, Markdown) с помощью шаблонов и тем, генерируя статичную HTML-структуру для публикации на любом хостинге. Но в современном мире, когда все больше и больше сайтов и приложений разрабатываются с использованием контейнеризации и облачных сервисов, использование Docker образов для публикации статических сайтов становится все более популярным и удобным способом.
Предварительная настройка#
- Сгенерируйте Access Token на GitHub с правами
repo
иwrite:packages
. - Создайте Secret с именем TOKEN в настройках вашего репозитория. Перейдите в Settings, слева в меню выберите Secrets and variables > Actions. Затем нажмите New repository secret и введите имя TOKEN и значение вашего Access Token.
- Добавьте в
.gitignore
папку/public/
, для того чтобы не было конфликтов при генерации страниц.
Пример .gitignore
файла
# Директория с сгенерированным сайтом
/public/
# Кэшированные и сгенерированные ресурсы Hugo
/resources/_gen/
# Лог файлы и статистика
hugo_stats.json
# Выполнимые файлы Hugo (если используются локально)
/hugo
/hugo.exe
/hugo.darwin
/hugo.linux
# Разные лишние файлы
.DS_Store
Thumbs.db
Dockerfile#
# Стадия сборки
FROM alpine:latest AS build
# Установка HUGO
RUN apk add --update hugo
WORKDIR /opt/HugoApp
# Копирование файлов
COPY . .
# Генерация сайта
RUN hugo --minify
# Стадия упаковки
FROM nginx:1.25-alpine
WORKDIR /usr/share/nginx/html
# Копирование сгенерированного сайта
COPY --from=build /opt/HugoApp/public .
# Открытие порта
EXPOSE 80/tcp
GitHub Actions#
Создайте файл .github/workflows/deploy.yml
в корне вашего репозитория. Данный Github Action будет запускаться при каждом пуше в ветку main
. Подробнее о триггерах можете прочитать в документации.
❗ Внимание
Замените
REPLACE_REPO_NAME
на имя вашего репозитория.
1name: Build and Push Docker Image
2
3# Триггер при пуше в ветку main
4on:
5 push:
6 branches:
7 - main
8
9jobs:
10 build-and-push:
11 runs-on: ubuntu-latest
12
13 steps:
14 - name: Checkout repository with submodules
15 uses: actions/checkout@v3
16 with: # Если не используете Git Submodules можете удалить этот параметр
17 submodules: recursive
18
19 - name: Set up Docker Buildx
20 uses: docker/setup-buildx-action@v3
21
22 - name: Log in to GitHub Container Registry
23 uses: docker/login-action@v2
24 with:
25 registry: ghcr.io
26 username: ${{ github.actor }}
27 password: ${{ secrets.TOKEN }}
28
29 - name: Build and push Docker image
30 uses: docker/build-push-action@v4
31 with:
32 context: .
33 push: true
34 tags: ghcr.io/${{ github.repository_owner }}/[REPLACE_REPO_NAME]:latest
35 platforms: linux/amd64
Запушьте изменения и дождитесь завершения процесса (Вкладка Actions в вашем репозитории).
Запуск#
Если у вас приватный репозиторий, то вам нужно залогиниться в GitHub Docker Registry с использованием Access Token - Аутентификация ghcr.io в Docker.
Запуск через Docker#
docker run -d -p 8080:80 --restart unless-stopped ghcr.io/[REPLACE_USERNAME]/[REPLACE_REPO_NAME]:latest
Запуск через Docker Compose#
Создайте файл docker-compose.yml
.
services:
app:
image: ghcr.io/[REPLACE_USERNAME]/[REPLACE_REPO_NAME]:latest
ports:
- "8080:80"
restart: unless-stopped
И выполните команду:
docker compose up -d
После запуска сайт должен быть доступен по адресу http://localhost:8080.