# Docker Для сборки и развертывания своего приложения в контейнере Docker можно вообще не писать [файл конфигурации](config-file.md) `amvera.yaml`. Достаточно написать `Dockerfile`. Однако для более точной настройки файл `amvera.yaml` может понадобиться. ![settings](../../img/docker_proc.png) При использовании Dockerfile сначала инициализируется процесс сборки образа, запускаемый в отдельном контейнере с доступом к папке Code. По завершению сборки образ загружается в хранилище (registry). После успешной загрузки образа инициализируется процесс разворачивания приложения, в процессе которого создается контейнер из полученного ранее образа. ```{eval-rst} .. admonition:: Важно :class: warning 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`: абсолютный путь в файловой системе контейнера, куда должна быть примонтирована [папка с постоянным хранилищем](../storage.md#data); по умолчанию равен `/data` - `containerPort`: номер порта TCP, который слушает приложение в контейнере; по умолчанию равен `80`. ## Рецепты ### Свое приложение с нестандартным портом Если ваше приложение работает по протоколу HTTP, но использует номер порта, отличный от 80, это можно настроить следующим файлом `amvera.yml`: ```yaml run: containerPort: 3000 ``` ### Свое приложение с нестандартным расположением Dockerfile Допустим, Dockerfile находится по пути `myapp/amvera.dockerfile`: ```yaml 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`: ```yaml build: skip: yes run: image: lscr.io/linuxserver/dokuwiki:latest persistenceMount: /config ``` Так как кроме файла `amvera.yml` вам ничего не нужно, это единственный файл, который нужно отправить в репозиторий git, созданный для проекта. ### Приложение с нестандартным ENTRYPOINT Если вы написали приложение и не указали в `Dockerfile` ни `ENTRYPOINT`, ни `CMD`, либо используете готовый образ и хотите использовать иное приложение из него, нежели было предусмотрено разработчиком, вам пригодятся параметры `run.command` и `run.args`. Для примера рассмотрим приложение на языке Go: ```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` для него: ```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`: ```yaml run: command: /app/server args: --port 8080 containerPort: 8080 ```