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/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