Docker

Для сборки и развертывания своего приложения в контейнере Docker можно вообще не писать файл конфигурации amvera.yaml. Достаточно написать Dockerfile. Однако для более точной настройки файл amvera.yaml может понадобиться.

settings

При использовании Dockerfile сначала инициализируется процесс сборки образа, запускаемый в отдельном контейнере с доступом к папке Code. По завершению сборки образ загружается в хранилище (registry). После успешной загрузки образа инициализируется процесс разворачивания приложения, в процессе которого создается контейнер из полученного ранее образа.

Важно

docker-compose.yml не поддерживается. Возможно использование только классического Dockerfile.

Конфигурационный файл

Для более точной настройки следует дополнять Dockerfile файлом конфигурации amvera.yaml. Использование файла конфигураци дает возможность пропустить сборку и запускать приложение с использованием готового общедоступного образа из сторонних registry. Так-же можно указать папку монтирования постоянного хранилища.

Секция meta

Для окружения Docker секцию meta можно не писать вовсе. По умолчанию, она подразумевается следующей:

meta:
  environment: docker
  toolchain:
    name: docker

Секция build

Секция build поддерживает следующие параметры:

  • dockerfile: путь до файла Dockerfile относительно папки с исходным кодом (без слэша в начале); это необязательный параметр: если его не указать, то Dockerfile будет искаться в следующих местах:

    • amvera/Dockerfile

    • Dockerfile

    • docker/Dockerfile

    • deploy/Dockerfile

    • deployment/Dockerfile

  • skip: пропуск сборки образа; применяется при запуске готовых образов Docker.

Секция run

Секция run поддерживает следующие параметры:

  • image: образ для запуска вместо собранного; обычно используется в сочетании с build.skip: yes;

  • command: команда для запуска в указанном образе; полезно в сочетании с run.image; в этом параметре указывается то, что указывается в параметре ENTRYPOINT докерфайла или в параметре command для пода Kubernetes: обычно это имя команды без параметров;

  • args: параметры команды, указанной в run.command; в этом параметре указвается то, что указывается в параметре CMD докерфайла или в параметре args для пода Kubernetes с тем отличием, что здесь параметры указываются обычной строкой, а не массивом;

  • persistenceMount: абсолютный путь в файловой системе контейнера, куда должна быть примонтирована папка с постоянным хранилищем; по умолчанию равен /data

  • containerPort: номер порта TCP, который слушает приложение в контейнере; по умолчанию равен 80.

Рецепты

Свое приложение с нестандартным портом

Если ваше приложение работает по протоколу HTTP, но использует номер порта, отличный от 80, это можно настроить следующим файлом amvera.yml:

run:
  containerPort: 3000

Свое приложение с нестандартным расположением Dockerfile

Допустим, Dockerfile находится по пути myapp/amvera.dockerfile:

build:
  dockerfile: myapp/amvera.dockerfile

Готовый образ Docker

Если вам нужно запустить готовый образ Docker, который либо работает по протоколу HTTP, либо не принимает входящих соединений (например, бот), можно пропустить фазу сборки и указать имя образа напрямую.

В качестве примера рассмотрим развертывание Dokuwiki (https://hub.docker.com/r/linuxserver/dokuwiki). Dokuwiki слушает порт 80, поэтому эту настройку нам менять не нужно. А вот папку с данными нужно примонтировать по пути /config. Получается следующий файл amvera.yml:

build:
  skip: yes

run:
  image: lscr.io/linuxserver/dokuwiki:latest
  persistenceMount: /config

Так как кроме файла amvera.yml вам ничего не нужно, это единственный файл, который нужно отправить в репозиторий git, созданный для проекта.

Приложение с нестандартным ENTRYPOINT

Если вы написали приложение и не указали в Dockerfile ни ENTRYPOINT, ни CMD, либо используете готовый образ и хотите использовать иное приложение из него, нежели было предусмотрено разработчиком, вам пригодятся параметры run.command и run.args.

Для примера рассмотрим приложение на языке Go:

package main

import (
	"fmt"
	"net/http"
	"os"
)

func main() {
	var port string
	if (len(os.Args) > 2) && (os.Args[1] == "--port") {
		port = fmt.Sprintf(":%v", os.Args[2])
	} else {
		port = ":80"
	}

	http.HandleFunc("/", HelloServer)
	http.ListenAndServe(port, nil)
}

func HelloServer(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
}

Dockerfile для него:

FROM golang:1.19

WORKDIR /app

COPY server.go go.mod ./

RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o server

FROM alpine:latest

WORKDIR /app

COPY --from=0 /app/server ./

Чтобы запустить сервер, нужно вызвать команду /app/server --port 8080, но в Dockerfile по тем или иным причинам это не написано. Укажем параметры запуска в amvera.yml:

run:
  command: /app/server
  args: --port 8080
  containerPort: 8080