Постановка задачи

На основании Docker и Docker Compose разработайте систему для формирования и публикации статического сайта с помощью статического генератора сайтов Jekyll.

Система должна предоставлять:

  • Возможность запустить встроенный веб-сервер Jekyll в Docker-контейнере для проверки наполнения сайта.
  • Возможность запустить контейнер с веб-сервером Nginx, который будет раздавать собранный с помощью Jekyll статический сайт в качестве финальной публикации.

Работа с Jekyll

Jekyll — это генератор статических сайтов, реализованный как джем Ruby. Для его использования на компьютере должен быть установлен интерпретатор языка и поставлена соответствующий джем.

Вы можете следовать использовать следующий шаблон приложения: https://github.com/amvasilyev/2020-unix-jekyll-repository. После клонирования репозитория необходимо поставить зависимости:

bundle install

Запуск встроенного сервера

Для запуска встроенного веб-сервера необходимо выполнить:

bundle exec jekyll serve --host 0.0.0.0 --port 4000

После этого можно открыть сайт по адресу http://localhost:4000.

Создание статического сайта

Для формирования финальной версии сайта необходимо выполнить:

bundle exec jekyll build

Результат сборки будет расположен в каталоге _site. Данные файлы можно перемещать в любой каталог.

У каждой из задач есть множество параметров, которые можно использовать, но представленных должно хватить для решения задачи.

Предложения по технической реализации

  1. Склонируйте репозиторий примера сайта Jekyll.
  2. Добавьте в корне проекта файл Dockerfile.
  3. В Dockerfile сформируйте описание базового образа, в котором можно запускать Jekyll-команды из текущего проекта. Назовём его jekyll-base.
    • В качестве базового образа используйте один из официальных Ruby-образов.
    • Добавьте в него Gemfile и Gemfile.lock и убедитесь, что все зависимости успешно устанавливаются с помощью Bundler.
    • Укажите в образе каталог /app в качестве хранилища и рабочего каталога.
    • В качестве команды для запуска укажите jekyll serve.
  4. На основании этого образа создайте сборочный образ, с помощью которого будет собираться финальное приложение. Синтаксис можно посмотреть по ссылке https://docs.docker.com/develop/develop-images/multistage-build/#use-a-previous-stage-as-a-new-stage. Назовём его jekyll-build.
    • Скопируйте внутрь данного образа всё содержимое приложения в каталог /build.
    • В данном каталоге выполните сборку сайта с помощью jekyll build.
  5. Добавьте описание образа для раздачи статического содержимого. Назовём его publish.
    • В качестве базового образа используйте Nginx-контейнер.
    • Скопируйте из образа jekyll-build файлы для раздачи сайта.
    • Проверьте, что данные файлы nginx сможет раздать.
  6. Добавьте в корне проекта файл docker-compose.yml. В нём необходимо описать 2 службы:
    1. Служба для разработки, основанная на jekyll-base-образе.
    2. Служба для развёртывания, основанная на publish-образе.

Финальный результат

После всей этой реализации пользователь должен иметь возможность:

  1. Запустить службу для разработки и проверить сайт:
    1. В корне проекта вызвать docker-compose up devel.
    2. Открыть в браузере http://localhost:4000.
  2. Запустить службу для развёртывания сайта:
    1. В корне проекта вызывать docker-copmose up deploy --build.
    2. Открыть в браузере http://localhost:8080.