Файлы, упомянутые в главе

  • Dockerfile
  • werf.yaml

В этой главе мы начнём работу с werf: контейнизируем тестовое приложение, используя werf и Dockerfile, и запустим конечный образ локально в Docker.

Подготовка рабочего места

Мы предполагаем, что вы уже установили werf и Docker.

Создайте директорию на своём компьютере и выполните там следующие шаги:

git clone https://github.com/werf/werf-guides.git
cp -r werf-guides/examples/springboot/000_app ./
cd 000_app 
git init
git add .
git commit -m "initial commit"

Так вы скопируете себе код приложения на SpringBoot и инициируете Git в каталоге с ним.

Реализация сборки в Dockerfile

Конфигурация сборки нашего приложения будет состоять из следующих шагов:

  • взять базовый образ с OpenJDK (gradle:jdk8-openj9 подойдёт);
  • добавить в него код приложения;
  • собрать приложение с помощью gradle и переместить полученный jar в подходящее место.

Реализуем это в Dockerfile:

FROM gradle:jdk8-openj9
WORKDIR /app
COPY . .

RUN gradle build --no-daemon
RUN cp /app/build/libs/*.jar /app/demo.jar

CMD ["java","-jar","/app/demo.jar"]
FROM gradle:jdk8-openj9 WORKDIR /app COPY . . RUN gradle build --no-daemon RUN cp /app/build/libs/*.jar /app/demo.jar CMD ["java","-jar","/app/demo.jar"]

Интеграция Dockerfile с werf

Подключим готовый Dockerfile к werf. Для этого, создадим в корне репозитория файл werf.yaml, описывающий сборку всего проекта:

project: werf-guided-springboot
configVersion: 1
---
image: basicapp
dockerfile: Dockerfile
project: werf-guided-springboot configVersion: 1 --- image: basicapp dockerfile: Dockerfile

Что тут написано?

werf.yaml начинается с обязательной секции мета-информации:

project: werf-guided-springboot
configVersion: 1
project: werf-guided-springboot configVersion: 1

Здесь:

  • project — поле, задающее уникальное имя проекта приложения. Имя проекта по умолчанию используется при генерации имени Helm-релиза и пространства имен, namespace, в Kubernetes. Изменение имени у активного проекта затруднительно и требует ряда действий, которые необходимо выполнить вручную (подробнее о возможных последствиях можно прочитать здесь);
  • configVersion определяет версию синтаксиса, используемую в werf.yaml (на данный момент поддерживается только версия 1).

Следующая секция конфигурации, которая и будет основной для сборки: image config section.

---
image: basicapp
dockerfile: Dockerfile
--- image: basicapp dockerfile: Dockerfile

В строке image: basicapp определяется идентификатор образа, который впоследствии может использоваться при конфигурации выката, а также для вызова команд werf для определённого образа из werf.yaml (к примеру, werf build basicapp, werf run basicapp и т.д.).

Строка dockerfile: Dockerfile указывает, что сборочная конфигурация описана в существующем файле, расположенном по пути Dockerfile.

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

В одном werf.yaml может быть описано произвольное количество образов.

Сборка

Перед выполнением сборки необходимо добавить изменения в git-репозиторий проекта:

git add werf.yaml Dockerfile
git commit -m "Add build configuration"

Почему изменения должны добавляться в git-репозиторий, что такое гитерминизм и режим разработчика, а также другие особенности работы с файлами проекта будут разобраны далее в главе «Необходимо знать»

Сборка выполняется командой werf build:

werf build
┌ ⛵ image basicapp
│ ┌ Building stage basicapp/dockerfile
│ │ basicapp/dockerfile  Sending build context to Docker daemon  116.7kB
│ │ basicapp/dockerfile  Step 1/15 : FROM gradle:jdk8-openj9
│ │ basicapp/dockerfile   ---> 2fb781988fa5
│ │ basicapp/dockerfile  Step 2/15 : WORKDIR /app
│ │ basicapp/dockerfile   ---> Using cache
<..>
│ │ basicapp/dockerfile  Successfully built e0d6df14df8b
│ │ basicapp/dockerfile  Successfully tagged ee51ea7f-c498-45a5-a435-0fd830fbb576:latest
│ ├ Info
│ │       name: werf-guided-springboot:50558f3f54d2ebbbd817824c6d7194aabe725bff6d7beae4df9c5e29-1606128099580
│ │       size: 738.6 MiB
│ └ Building stage basicapp/dockerfile (86.12 seconds)
└ ⛵ image basicapp (86.32 seconds)

Running time 86.37 seconds

Запуск

Запуск контейнера выполняется командой werf run:

werf run --docker-options="--rm -p 8080:8080" -- java -jar /app/demo.jar

Обратите внимание, что параметры docker задаются опцией --docker-options, а команда запуска после двух дефисов.

В werf.yaml может описываться произвольное количество образов. Для запуска контейнера определённого image из werf.yaml необходимо использовать позиционный аргумент команды (werf run basicapp ...).

Можно заметить, что вызов werf run осуществляет сборку, т.е. предварительная сборка не требуется.

Теперь приложение доступно локально на порту 8080: