Для сборки и развертывания своего приложения в контейнере Docker
можно вообще не писать файл `amvera.yml`.
Достаточно написать `Dockerfile`.
Однако для более точной настройки файл `amvera.yml` может понадобиться.
Для окружения Docker секцию `meta` можно не писать вовсе.
По умолчанию, она подразумевается следующей:
```
meta:
environment: docker
toolchain:
name: docker
```
Секция `build` поддерживает следующие параметры:
- `dockerfile`: путь до файла `Dockerfile` относительно папки
с исходным кодом (без слэша в начале); это необязательный
параметр: если его не указать, то `Dockerfile` будет искаться в следующих местах:
- `amvera/Dockerfile`
- `Dockerfile`
- `docker/Dockerfile`
- `deploy/Dockerfile`
- `deployment/Dockerfile`
- `skip`: пропуск сборки образа; применяется при запуске готовых образов Docker.
Секция `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](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
```