Документация Контейнер CLI (Docker)

Контейнер Mockarty CLI — универсальный мульти-режимный образ

Образ mockarty/cli — единый артефакт, обслуживающий все test-time режимы Mockarty: моки, нагрузочные тесты, функциональные тесты, фаззинг, chaos-инженерия. Один образ, один бинарь, шесть публикуемых тегов. Режим выбирается во время запуска (или зашивается в тег во время сборки).

TL;DR

# Универсальный образ — режим выбирается subcommand'ом:
docker run --rm -p 8080:8080 mockarty/cli:latest mock serve

# Или режимный тег — команда уже зашита в образ, передавайте только
# её аргументы и флаги:
docker run --rm -p 8080:8080 mockarty/cli:latest-mock
docker run --rm -v $PWD/k6.js:/k6.js mockarty/cli:latest-load /k6.js --vus 10 --duration 30s
docker run --rm -v $PWD/manifest.yaml:/m.yaml mockarty/cli:latest-test /m.yaml

Все шесть тегов собираются из одного бинаря и одной базы: одинаковая multi-arch сборка (linux/amd64 + linux/arm64). Отличается только зашитая команда.

Теги образа

Тег Зашитая команда Назначение
mockarty/cli:<version> — (пользователь сам выбирает subcommand) Скрипты, ручной запуск, разовые команды
mockarty/cli:<version>-mock mock serve Долгоживущий mock-сервер (WireMock/Mockoon/native)
mockarty/cli:<version>-load perf run Разовый нагрузочный тест (скрипты в формате k6)
mockarty/cli:<version>-test test run Разовый прогон нативного тест-манифеста Mockarty
mockarty/cli:<version>-fuzz fuzz run Разовая фаззинг-кампания
mockarty/cli:<version>-chaos chaos run Разовый chaos-эксперимент (нужен admin server)

В режимном теге команда — часть entrypoint образа: всё, что вы передаёте после имени образа, добавляется к ней (позиционные аргументы и флаги). Например, mockarty/cli:latest-load /k6.js --vus 10 выполнит perf run /k6.js --vus 10. Для другой подкоманды используйте универсальный тег.

Mocker mode — drop-in замена WireMock/Mockoon

mock serve поднимает in-process HTTP-сервер с одновременно WireMock admin API и нативным admin API Mockarty. Стабы грузятся из --data-dir на старте, новые можно POST’ить во время работы. Автодетекция позволяет смешивать WireMock, Mockoon и Mockarty native JSON в одной директории.

docker run --rm -p 8080:8080 \
    -v $PWD/stubs:/data:ro \
    mockarty/cli:latest-mock \
    --data-dir /data

Внутри контейнера сервер по умолчанию слушает 0.0.0.0:8080 — дополнительные флаги не нужны.

WireMock-совместимое admin API

Метод Путь Назначение
GET /__admin/health Liveness-проба (200 + JSON)
GET /__admin/mappings Список всех стабов
POST /__admin/mappings Создать стаб (автодетекция диалекта)
GET /__admin/mappings/{id} Получить один стаб
DELETE /__admin/mappings/{id} Удалить стаб
POST /__admin/reset Очистить все стабы (destructive)
curl -X POST http://localhost:8080/__admin/mappings \
    -H 'Content-Type: application/json' \
    -d '{"request":{"method":"GET","url":"/api/users"},"response":{"status":200,"body":"{\"ok\":true}"}}'

curl http://localhost:8080/api/users
# → 200 {"ok":true}

Нативное admin API Mockarty

Доступно одновременно на том же порту:

Метод Путь
POST / GET /__admin/api/v1/mocks
GET / DELETE /__admin/api/v1/mocks/{id}
GET / POST / DELETE /__admin/api/v1/stores/global

Используйте, когда нужны цепочки, faker, JsonPath и хранилища — всё работает в standalone-режиме без admin-узла.

Лимиты анонимного режима

Без лицензии (нет --api-key + --license-server и нет MOCKARTY_LICENSE_KEY env) каталог стабов ограничен 5 шт.. Шестой POST возвращает HTTP 402 с подсказкой пройти аутентификацию.

Снять лимит:

docker run --rm -p 8080:8080 \
    -e MOCKARTY_LICENSE_KEY=<your-token> \
    mockarty/cli:latest-mock

Load-runner mode

Путь к скрипту — позиционный аргумент (как у k6). Целевой URL задаётся внутри скрипта — передайте его через k6-совместимую переменную окружения (__ENV.BASE_URL в скрипте):

docker run --rm \
    -v $PWD/scripts:/scripts:ro \
    -v $PWD/reports:/reports \
    mockarty/cli:latest-load \
    /scripts/load.js \
    --env BASE_URL=https://api.example.com \
    --vus 50 \
    --duration 5m \
    --out json:/reports/load.json

Контейнер завершается с кодом 0 при успехе и ненулевым при провале порогов — удобно для CI.

Test-runner mode

Тег -test запускает нативный тест-манифест Mockarty (путь — позиционный аргумент):

docker run --rm \
    -v $PWD/tests:/tests:ro \
    -v $PWD/reports:/reports \
    mockarty/cli:latest-test \
    /tests/manifest.yaml \
    --out junit:/reports/junit.xml

Для Postman/Newman коллекций используйте универсальный тег с явной командой postman run (путь к коллекции — позиционный аргумент):

docker run --rm \
    -v $PWD/collections:/collections:ro \
    -v $PWD/reports:/reports \
    mockarty/cli:latest \
    postman run /collections/api.json \
    --out allure:/reports/allure \
    --out junit:/reports/junit.xml

Fuzz-runner mode

docker run --rm \
    -v $PWD/api.yaml:/api.yaml:ro \
    mockarty/cli:latest-fuzz \
    --spec /api.yaml \
    --target https://api.example.com \
    --duration 60s

Chaos-runner mode

Chaos требует admin-сервер Mockarty:

docker run --rm \
    -e MOCKARTY_SERVER=https://mockarty.company.com \
    -e MOCKARTY_TOKEN=mk_xxx \
    -v $PWD/experiments:/experiments:ro \
    mockarty/cli:latest-chaos \
    -f /experiments/network-blip.yaml

Эксперимент можно описать и целиком флагами — например --type pod_kill --namespace app --selector app=web --duration 5m.

Усиление

  • Distroless static база (~10 МБ + бинарь)
  • nonroot user (UID 65532)
  • Статическая линковка — нет зависимости от glibc
  • Совместим с read-only root FS (mount tmpfs в /tmp при необходимости)
  • Никаких CDN-запросов во время работы — air-gapped дружелюбно

Multi-arch

Официальные образы публикуются для linux/amd64 и linux/arm64 из одного
релиза, поэтому Apple Silicon и AWS Graviton — first-class.

Пример docker-compose

Multi-service setup делается просто — запустите контейнер CLI рядом с
контейнерами нагрузки и тест-раннеров, каждый на опубликованном образе:

services:
  mocker:
    image: mockarty/cli:latest-mock
    command: ["--data-dir", "/data"]
    volumes: ["./mocks:/data:ro"]
    ports: ["8080:8080"]

Полный пример из трёх сервисов (mock-сервер + нагрузочный + тест-раннер, связанные между собой) поставляется вместе с исходниками CLI как docker-compose.example.yml.

Интеграция с testcontainers

Java / Python / Go SDK testcontainers-обёртки по умолчанию ссылаются на mockarty/cli:latest-mock. Из тестового кода:

# Python
from mockarty.testcontainers import MockartyContainer
with MockartyContainer() as mock:
    mock.add_stub({"request": {"method":"GET","url":"/x"}, "response":{"status":200,"body":"ok"}})
    resp = requests.get(f"{mock.base_url}/x")
// Java
try (MockartyContainer mock = new MockartyContainer()) {
    mock.addStub("...");
    String body = HttpClient.get(mock.baseUrl() + "/x").body();
}

Обёртка тянет mockarty/cli:latest-mock, открывает 8080, останавливает на close(). Полные подробности — в README соответствующего SDK.