Skip to content

Adding a Service

This guide explains how to add a new shared service type to dde (e.g. memcached, elasticsearch, rabbitmq).

Shared services are Docker containers managed by dde’s SystemServiceManager. They are started automatically when a project declares them in .dde/config.yml and run with versioned container names (e.g. dde-memcached-1).

Step 1: Add the Service Type to ServiceRegistry

Section titled “Step 1: Add the Service Type to ServiceRegistry”

Edit src/Service/ServiceRegistry.php and add an entry to the SERVICE_TYPES constant:

private const array SERVICE_TYPES = [
// ... existing services ...
'memcached' => [
'image' => 'memcached',
'defaultVersion' => '1',
'defaultPort' => 11211,
'dataPath' => 'data',
'dataMount' => '/data',
'environment' => [],
],
];

Each entry requires:

KeyDescription
imageDocker Hub image name
defaultVersionDefault version tag (used if not overridden in config)
defaultPortDefault port the service exposes
dataPathSubdirectory name for persistent data
dataMountMount path inside the container for data volume
environmentDefault environment variables (e.g. root passwords)

After adding the service type, verify it works end-to-end:

  1. Add the service to a project’s .dde/config.yml:
services:
- name: memcached
  1. Start the project:
Terminal window
dde project:up
  1. Verify the container is running:
Terminal window
dde system:status
  1. Verify the service is reachable from project containers by its name (memcached).

If the new service is a database, you also need to:

  1. Create an adapter class implementing App\Database\DatabaseAdapterInterface in src/Database/
  2. Register it in App\Database\DatabaseAdapterRegistry

This enables dde db, dde db:export, dde db:import, and snapshot commands for the new database.

Document the new service type, including:

  • Default version and port
  • Any required environment variables
  • How projects should declare it

Users can override the default version globally or per-project:

# ~/.dde/config.yml (global)
services:
memcached:
version: "1.6"
# .dde/config.yml (project)
services:
- name: memcached
version: "1.6"

The override chain is: project explicit version > global services config > ServiceRegistry defaults.

  • Service containers are named dde-{name}-{version} (e.g. dde-memcached-1)
  • Different versions run as separate containers with separate data volumes
  • Services are shared across all projects; stopping a project does not stop shared services
  • Use dde system:down to stop all services