Skip to main content

Docker

Для сборки и развертывания своего приложения в контейнере 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). 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