Файлы, упомянутые в главе
- Dockerfile
- werf.yaml
В этой главе мы начнём работу с werf: контейнизируем тестовое приложение, используя werf и Dockerfile, и запустим конечный образ локально в Docker.
Подготовка рабочего места
Мы предполагаем, что вы уже установили werf и Docker.
Создайте директорию на своём компьютере и выполните там следующие шаги:
git clone https://github.com/werf/werf-guides.git
cp -r werf-guides/examples/golang/000_app ./
cd 000_app
git init
git add .
git commit -m "initial commit"
Так вы скопируете себе код приложения на Go и инициируете Git в каталоге с ним.
Реализация сборки в Dockerfile
Конфигурация сборки нашего приложения будет состоять из следующих шагов:
- взять официальный образ Go (
golang:1.15-alpine
подойдёт); - добавить в него код приложения;
- установить модули-зависимости;
- скомпилировать бинарный файл приложения;
- взять базовый образ alpine (например,
alpine:3.13
); - скопировать в него бинарный файл с приложением из сборочного образа.
Реализуем это в Dockerfile
:
FROM golang:1.15-alpine as builder
RUN apk add --update gcc musl-dev
WORKDIR /app
COPY go.* /app/
RUN go mod download
COPY /cmd /app/cmd
RUN go build ./cmd/demoapp
FROM alpine:3.13
COPY --from=builder /app/demoapp /app/demoapp
COPY /app.db /app/app.db
CMD ["/app/demoapp"]
Интеграция Dockerfile с werf
Подключим готовый Dockerfile к werf. Для этого, создадим в корне репозитория файл werf.yaml
, описывающий сборку всего проекта:
project: werf-guided-golang
configVersion: 1
---
image: basicapp
dockerfile: Dockerfile
Сборка
Перед выполнением сборки необходимо добавить изменения в 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 golang:1.15-alpine as builder
│ │ basicapp/dockerfile ---> 1de1afaeaa9a
│ │ basicapp/dockerfile Step 2/16 : RUN apk add --update gcc musl-dev
│ │ basicapp/dockerfile ---> Using cache
<..>
│ │ basicapp/dockerfile Successfully built f2a49a68a666
│ │ basicapp/dockerfile Successfully tagged c89c09f6-411f-4d4c-9c9e-43f4bdfad074:latest
│ ├ Info
│ │ name: werf-guided-golang:f276ddd4d73aafb69d657234505e718f78284bbdd816863f1540a912-1611832304608
│ │ size: 17.8 MiB
│ └ Building stage basicapp/dockerfile (55.42 seconds)
└ ⛵ image basicapp (55.75 seconds)
Running time 55.82 seconds
Запуск
Запуск контейнера выполняется командой werf run:
werf run --docker-options="--rm -p 3000:3000" -- /app/demoapp
Обратите внимание, что параметры docker задаются опцией --docker-options
, а команда запуска после двух дефисов.
В werf.yaml
может описываться произвольное количество образов. Для запуска контейнера определённого image
из werf.yaml необходимо использовать позиционный аргумент команды (werf run basicapp ...
).
Можно заметить, что вызов werf run
осуществляет сборку, т.е. предварительная сборка не требуется.
Теперь приложение доступно локально на порту 3000: