Convert Docker Compose files to Docker Engine API ServiceSpec objects for use with Docker Swarm.
compose2spec is a TypeScript library that converts Docker Compose YAML files (v2 and v3) into an array of Docker Engine API ServiceSpec objects. These objects can be directly used with dockerode.createService() to deploy services to a Docker Swarm cluster.
- ✅ Converts Docker Compose v2/v3 to Docker Swarm ServiceSpec
- ✅ Full TypeScript support with type definitions
- ✅ Supports environment variables, ports, volumes, networks
- ✅ Handles resource limits (CPU, memory)
- ✅ Supports deploy configurations (replicas, resources)
- ✅ ESM and CommonJS module support
- ✅ Comprehensive test coverage
npm install compose2specimport { parseComposeToServiceSpecs } from 'compose2spec';
import Dockerode from 'dockerode';
// Create Dockerode instance
const docker = new Dockerode();
// Parse compose file
const specs = await parseComposeToServiceSpecs('./docker-compose.yml');
// Create services in Docker Swarm
await Promise.all(specs.map(spec => docker.createService(spec)));import { parseComposeToServiceSpecs } from 'compose2spec';
const composeYaml = `
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "8080:80"
environment:
- FOO=bar
deploy:
replicas: 2
resources:
limits:
memory: 512M
cpus: "0.5"
`;
const specs = await parseComposeToServiceSpecs(composeYaml);import { parseComposeToServiceSpecsSync } from 'compose2spec';
const specs = parseComposeToServiceSpecsSync('./docker-compose.yml');- Services - image, command, entrypoint, environment
- Ports - published/target port mappings
- Volumes - bind, volume, and tmpfs mounts
- Networks - service network attachments
- Deploy - replicas, resource limits (CPU/memory)
- Environment - both array and object formats
Async function to parse Docker Compose file to ServiceSpec array.
input: Path to compose file, YAML string, or parsed object
Synchronous version of the parser.
Convert a single service definition to a ServiceSpec.
Input (docker-compose.yml):
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "8080:80"
environment:
- FOO=bar
- BAZ=qux
deploy:
replicas: 2
resources:
limits:
memory: 512M
cpus: "0.5"
volumes:
- data:/usr/share/nginx/html
networks:
- frontend
networks:
frontend:
volumes:
data:Output:
[
{
"Name": "web",
"TaskTemplate": {
"ContainerSpec": {
"Image": "nginx:latest",
"Env": ["FOO=bar", "BAZ=qux"],
"Mounts": [{
"Type": "volume",
"Source": "data",
"Target": "/usr/share/nginx/html"
}]
},
"Resources": {
"Limits": {
"NanoCPUs": 500000000,
"MemoryBytes": 536870912
}
}
},
"Mode": {
"Replicated": {
"Replicas": 2
}
},
"Networks": [{
"Target": "frontend"
}],
"EndpointSpec": {
"Ports": [{
"Protocol": "tcp",
"PublishedPort": 8080,
"TargetPort": 80
}]
}
}
]MIT