Skip to content

Самодостаточный Docker-образ для локального MCP (docker-compose-mcp-only) - #33

Open
malikov-pro wants to merge 9 commits into
zeegin:mainfrom
malikov-pro:feat/mcp-docker-image
Open

Самодостаточный Docker-образ для локального MCP (docker-compose-mcp-only)#33
malikov-pro wants to merge 9 commits into
zeegin:mainfrom
malikov-pro:feat/mcp-docker-image

Conversation

@malikov-pro

Copy link
Copy Markdown

Closes #32

Что делает

  • docker-compose-mcp-only/ — отдельный стек только для MCP: самодостаточный образ (python:3.12-alpine, ~305 МБ против ~485 МБ у slim-варианта) с базой стандартов и поисковым индексом, сгенерированными на этапе сборки. Монтирование репозитория не нужно:
    • docker compose -f docker-compose-mcp-only/docker-compose.yml up -d v8std-mcp
    • или без клона: docker run -d --name v8std-mcp -p 127.0.0.1:8765:8765 malikovpro/v8std-mcp:latest
  • Существующий docker-compose/ не изменён — сборка документации и локальный MCP с монтированием репозитория работают как раньше.
  • Багфикс requirements-mcp.txt: добавлен явный Pillowgenerate_ai_artifacts.py импортирует generate_social_cards.py на верхнем уровне, а Pillow раньше приходил только транзитивно через окружение zensical. Теперь пины PyYAML==6.0.3, Pillow==12.3.0 — стабильные версии с musllinux-колёсами (x86_64/aarch64), компилятор в образе не нужен.
  • scripts/build_mcp_image.sh — сборка локального образа, smoke-тест (HTTP-проверка http://127.0.0.1:8765/mcp), мультиархитектурный push с тегами latest / YYYY-MM-DD / sha-….
  • .github/workflows/docker-publish.yml — пересборка и публикация образа при изменениях docs/**, scripts/**. Параметризован: vars.DOCKERHUB_IMAGE + secrets DOCKERHUB_USERNAME/DOCKERHUB_TOKEN; job пропускается, пока переменная не задана. Включён setup-qemu-action для сборки arm64.
  • Документация: README, docs/support.md — запуск без клона репозитория и описание тегов.

Проверено локально

Примечания

  • Имя образа в compose — malikovpro/v8std-mcp:latest. Если проекту удобнее свой namespace — меняется одной строкой, workflow параметризован (см. открытые вопросы в Готовый Docker-образ для локального MCP (публикация в Docker Hub) #32).
  • Режим V8STD_MCP_GENERATE_INDEX=always в self-contained образе не поддерживается (в нём нет шрифтов для генерации соцкарточек); полный индекс с нуля — через существующий стек docker-compose/.

- docker-compose/docker/Dockerfile.mcp: slim-образ без zensical,
  индекс генерируется на этапе сборки, ENTRYPOINT run_v8std_mcp.sh
- requirements-mcp.txt: явная зависимость Pillow (ранее приходила
  транзитивно через zensical, без него generate_ai_artifacts падает)
- docker-compose: сервис v8std-mcp использует готовый образ
  malikovpro/v8std-mcp, монтирование репозитория больше не нужно
- scripts/build_mcp_image.sh: сборка, smoke-тест, мультиархитектурный push
- .github/workflows/docker-publish.yml: публикация образа при изменениях
  docs/scripts (имя образа через vars.DOCKERHUB_IMAGE, секреты
  DOCKERHUB_USERNAME/DOCKERHUB_TOKEN)
- документация: запуск MCP без клонирования репозитория
- база python:3.12-alpine вместо python:3.12-slim (~40% легче)
- font-dejavu через apk + симлинк в Debian-путь для find_font
- requirements-mcp.txt: пины PyYAML==6.0.3, Pillow==12.3.0 — обе
  имеют musllinux-колёса cp312 (x86_64/aarch64), компилятор не нужен
- busybox adduser вместо useradd
Соцкарточки в self-contained образе не рендерятся: индекс запечён
на этапе сборки, режим always не поддерживается. Pillow остаётся —
нужен генератору индекса на импорте.
…нера

- run_v8std_mcp.sh — bash-скрипт, в python:3.12-alpine bash отсутствует
- smoke: без --rm, чтобы docker logs был доступен после падения
  (уборка контейнера осталась в trap EXIT)
…ocker-compose

- docker-compose/ возвращён к исходному состоянию (стек docs+MCP
  с монтированием репозитория не меняется)
- docker-compose-mcp-only/: отдельный compose, Dockerfile.mcp и
  .dockerignore для самодостаточного образа из Docker Hub
- пути обновлены в scripts/build_mcp_image.sh, workflow и документации
- run_v8std_mcp.sh: env V8STD_MCP_ALLOWED_HOSTS/V8STD_MCP_ALLOWED_ORIGINS
  дополняют дефолтные списки allowed-host/allowed-origin (защита от
  DNS-rebinding остается включенной)
- compose: публикация порта через V8STD_MCP_BIND (по умолчанию 127.0.0.1)
- документация: раздел про доступ из локальной сети
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Готовый Docker-образ для локального MCP (публикация в Docker Hub)

1 participant