Контейнер 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.