Skip to content

Local package -> Docker image workflow

This guide walks through building Node Wire packages locally (as wheels) and using those wheels to build the Docker images in docker/.

The Dockerfiles in this repo install local wheel artifacts from packages/**/dist/*.whl, so you must build wheels first.


Prerequisites

  • Python 3.11+ available in your shell
  • Docker installed and running
  • Build tooling installed:
python -m pip install --upgrade build cython wheel

Run all commands from the repository root:


1) Build wheel packages locally

Build all runtime + connector wheels:

bash scripts/build-packages.sh

Build only specific packages (faster when iterating):

bash scripts/build-packages.sh \
  packages/runtime \
  packages/connectors/smtp \
  packages/connectors/stripe

The script (scripts/build-packages.sh in default mode, not --all): - builds host wheels and Linux-compatible wheels (via Docker), - writes artifacts under each package's dist/ folder, - fails if any .py source files leak into a wheel.

For optional local cibuildwheel builds (broader wheel matrix on your host), see Optional: broader wheels in docs/packaging.md.


2) Confirm wheel artifacts exist

Quick check (example for SMTP):

ls packages/runtime/dist/*.whl
ls packages/connectors/smtp/dist/*.whl
ls packages/connectors/stripe/dist/*.whl

If ls fails, rebuild that package before continuing.


3) Build Docker images from local wheels

Build all MCP connector images

./scripts/build-mcp-images.sh

With explicit version tag:

./scripts/build-mcp-images.sh --version 0.1.0

This builds: - nw-google-drive - nw-smartonfhir-epic - nw-smartonfhir-cerner - nw-smtp - nw-stripe - nw-salesforce - nw-slack

Build one image manually

docker build -f docker/smtp/Dockerfile -t nw-smtp:local .

Wheel requirements by image

Each Dockerfile expects specific wheel files to exist in dist/. Keep this table in sync with the Dockerfiles in docker/ — add a row here whenever you add a Tier 3 standalone MCP image (see connectors.md — Step 12).

Image Required wheels
docker/smtp/Dockerfile packages/runtime/dist/*.whl, packages/connectors/smtp/dist/*.whl
docker/google-drive/Dockerfile packages/runtime/dist/*.whl, packages/connectors/google_drive/dist/*.whl
docker/fhir-epic/Dockerfile packages/runtime/dist/*.whl, packages/connectors/fhir_epic/dist/*.whl
docker/fhir-cerner/Dockerfile packages/runtime/dist/*.whl, packages/connectors/fhir_cerner/dist/*.whl
docker/stripe/Dockerfile packages/runtime/dist/*.whl, packages/connectors/stripe/dist/*.whl
docker/salesforce/Dockerfile packages/runtime/dist/*.whl, packages/connectors/salesforce/dist/*.whl
docker/slack/Dockerfile packages/runtime/dist/*.whl, packages/connectors/slack/dist/*.whl
Dockerfile (unified MCP server) runtime + connector wheels (http_generic, stripe, smtp, slack, google_drive, fhir_epic, fhir_cerner)

Common failures and fixes

COPY ... dist/*.whl failed: no source files were specified

A required wheel is missing. Re-run scripts/build-packages.sh for the missing package(s), then rebuild the image.

Docker build cannot find src/ or config/

Use repo root as build context (.):

docker build -f docker/smtp/Dockerfile -t nw-smtp:local .

Do not run docker build from inside docker/<name>/.

Docker daemon not running

Start Docker Desktop (or daemon) and retry package/image builds.


# 1) Rebuild changed packages
bash scripts/build-packages.sh packages/runtime packages/connectors/smtp

# 2) Build image(s)
docker build -f docker/smtp/Dockerfile -t nw-smtp:local .

# 3) Verify image exists
docker images --filter reference=nw-smtp