Документация по использованию Docker

Полная документация Amvera Cloud по ссылке https://docs.amvera.ru/

В разделе собрана базовая документация для быстрого ознакомления с процессом развертывания на время восстановления основного портала с документацией
Использование Dockerfile

Для сборки и развертывания своего приложения в контейнере 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
```
Хотите попробовать?
Пожалуйста, оставьте контакты - мы свяжемся с вами как можно быстрее
Контакты
Москва, Пресненская Набережная 10с2