Week 01. Distroless Task (Slurm Навыкум "Build Containers!")

Задача

Есть сервис на Go (исходники сервиса и хранятся в этом каталоге) и для него даже написан Dockerfile и docker-compose.yml, который демонстрирует использование приложения. Разработчики говорят*, что Заказчик требовал в качестве базы Distroless Base Debian11 и они успешно выполнили требование. Вам нужно лишь "немного" доработать 😊 (цитата: "ну у вас же есть там всякие девопсерские заморочки, типа как должно быть красиво" 😈).

Примечание*: разработчикам, конечно же, нужно доверять, но желательно проверить, всё ли там действительно настроено верно.

Формулировка разработчика

Разработчик сказал следующее (дословно):

Стандартный проект на Go, сборка описана в Dockerfile, рядом docker-compose.yml, в котором описано, как запускать проект вместе с СУБД

Параметры в приложение передаются через флаги, например:

./app -port=8000 -host=... -dbUrl=...

Переделывать с флагов на что-то другое не нужно, пусть остаются флаги, но значения в флаги нужно передавать через переменные окружения, например:

docker run -e APP_PORT=9999 ...

Для проверки нужно отправить POST обычным application/x-www-form-urlencoded на http://localhost:9000/api/events следующего вида:

action=view&product=k8s&fingerprint=XYZ

В ответ придёт код 200

Что нужно сделать (дословно):

Упаковать всё в Docker так, чтобы можно было все флаги задавать через переменные окружения (при этом делать ENTRYPOINT или CMD в виде скриптов не нужно, запускаться должен именно app)

Никаких entrypoint.sh и других sh-скриптов писать не нужно

Переделывать приложение (редактировать исходный код) тоже не нужно

Никаких тестов, проверок стиля кода, проверок безопасности (в том числе сканирования зависимостей и образов на уязвимости) делать не нужно

Сборку организовать в виде Multi-Stage, взяв за основу существующий Dockerfile (нужно внести в него изменения, а не создавать с нуля новый)

Статически слинкованный бинарник создавать не нужно

Запускать приложение нужно не от root'а (прописывайте это явно в Dockerfile)

Выложить всё в виде публичного образа на GHCR (GitHub Container Registry), чтобы мы могли сами затестить и переиспользовать

Требования

  1. Всё должно быть оформлено в виде публичного репозитория на GitHub
  2. Вся сборка образов должна проходить через GitHub Actions
  3. Образ должен выкладываться в GitHub Container Registry (GHCR)

К текущему заданию дополнительно предъявляются требования:

  1. Docker Legacy Build (DOCKER_BUILDKIT=0 docker build .)
  2. Multi-Stage