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

  • Dockerfile
  • werf.yaml

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

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

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

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

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

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

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

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

  • взять базовый образ с Node.js (node:14-stretch подойдёт);
  • добавить в него код приложения;
  • установить зависимости npm.

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

FROM node:14-stretch
WORKDIR /app
COPY . .

RUN apt update
RUN apt install -y tzdata locales
RUN npm ci

CMD ["node","/app/app.js"]
FROM node:14-stretch WORKDIR /app COPY . . RUN apt update RUN apt install -y tzdata locales RUN npm ci CMD ["node","/app/app.js"]

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

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

project: werf-guided-nodejs
configVersion: 1
---
image: basicapp
dockerfile: Dockerfile
project: werf-guided-nodejs configVersion: 1 --- image: basicapp dockerfile: Dockerfile
Что тут написано?

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

project: werf-guided-nodejs
configVersion: 1
project: werf-guided-nodejs 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:

┌ ⛵ image basicapp
│ ┌ Building stage basicapp/dockerfile
│ │ basicapp/dockerfile  Sending build context to Docker daemon  69.63kB
│ │ basicapp/dockerfile  Step 1/16 : FROM node:14-stretch
│ │ basicapp/dockerfile   ---> b90fa0d7cbd1
│ │ basicapp/dockerfile  Step 2/16 : WORKDIR /app
│ │ basicapp/dockerfile   ---> Using cache
<..>
│ │ basicapp/dockerfile  Successfully built 02a0a425890a
│ │ basicapp/dockerfile  Successfully tagged a1cbf6dc-343f-4a77-b846-d0f12a700cb7:latest
│ ├ Info
│ │       name: werf-guided-nodejs:a473b87e1ad65f102fa90f8c6647b03056e5ae95ff1ef3c5e7fd2c31-1605597979927
│ │       size: 953.1 MiB
│ └ Building stage basicapp/dockerfile (21.94 seconds)
└ ⛵ image basicapp (22.04 seconds)

Running time 22.07 seconds

Запуск

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

werf run --docker-options="--rm -p 3000:3000 -e "SQLITE_FILE=app.db"" -- node /app/app.js

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

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

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

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

Приложение в браузере