feat: auto-pull images + registry path for node-runner #12

Merged
michal merged 1 commits from feat/node-runner-registry-pull into main 2026-02-23 00:03:20 +00:00
2 changed files with 13 additions and 2 deletions

View File

@@ -5,7 +5,7 @@ import { NotFoundError } from './mcp-server.service.js';
import { resolveServerEnv } from './env-resolver.js'; import { resolveServerEnv } from './env-resolver.js';
/** Default image for npm-based MCP servers (STDIO with packageName, no dockerImage). */ /** Default image for npm-based MCP servers (STDIO with packageName, no dockerImage). */
const DEFAULT_NODE_RUNNER_IMAGE = process.env['MCPD_NODE_RUNNER_IMAGE'] ?? 'mcpctl-node-runner:latest'; const DEFAULT_NODE_RUNNER_IMAGE = process.env['MCPD_NODE_RUNNER_IMAGE'] ?? 'mysources.co.uk/michal/mcpctl-node-runner:latest';
/** Network for MCP server containers (matches docker-compose mcp-servers network). */ /** Network for MCP server containers (matches docker-compose mcp-servers network). */
const MCP_SERVERS_NETWORK = process.env['MCPD_MCP_NETWORK'] ?? 'mcp-servers'; const MCP_SERVERS_NETWORK = process.env['MCPD_MCP_NETWORK'] ?? 'mcp-servers';
@@ -206,6 +206,13 @@ export class InstanceService {
} }
} }
// Pull image if not available locally
try {
await this.orchestrator.pullImage(image);
} catch {
// Image may already be available locally
}
const containerInfo = await this.orchestrator.createContainer(spec); const containerInfo = await this.orchestrator.createContainer(spec);
const updateFields: { containerId: string; port?: number } = { const updateFields: { containerId: string; port?: number } = {

View File

@@ -28,6 +28,8 @@ services:
MCPD_PORT: "3100" MCPD_PORT: "3100"
MCPD_HOST: "0.0.0.0" MCPD_HOST: "0.0.0.0"
MCPD_LOG_LEVEL: ${MCPD_LOG_LEVEL:-info} MCPD_LOG_LEVEL: ${MCPD_LOG_LEVEL:-info}
MCPD_NODE_RUNNER_IMAGE: mysources.co.uk/michal/mcpctl-node-runner:latest
MCPD_MCP_NETWORK: mcp-servers
depends_on: depends_on:
postgres: postgres:
condition: service_healthy condition: service_healthy
@@ -47,8 +49,10 @@ networks:
mcpctl: mcpctl:
driver: bridge driver: bridge
mcp-servers: mcp-servers:
name: mcp-servers
driver: bridge driver: bridge
internal: true # Not internal — MCP servers need outbound access for external APIs.
# Isolation enforced by not binding host ports on MCP containers.
volumes: volumes:
mcpctl-pgdata: mcpctl-pgdata: