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

При использовании 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/DockerfileDockerfiledocker/Dockerfiledeploy/Dockerfiledeployment/Dockerfile
skip: пропуск сборки образа; применяется при запуске готовых образов Docker.
Секция run¶
Секция run поддерживает следующие параметры:
image: образ для запуска вместо собранного; обычно используется в сочетании сbuild.skip: yes;command: команда для запуска в указанном образе; полезно в сочетании сrun.image; в этом параметре указывается то, что указывается в параметреENTRYPOINTдокерфайла или в параметреcommandдля пода Kubernetes: обычно это имя команды без параметров;args: параметры команды, указанной вrun.command; в этом параметре указвается то, что указывается в параметреCMDдокерфайла или в параметреargsдля пода Kubernetes с тем отличием, что здесь параметры указываются обычной строкой, а не массивом;persistenceMount: абсолютный путь в файловой системе контейнера, куда должна быть примонтирована папка с постоянным хранилищем; по умолчанию равен/datacontainerPort: номер порта 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