This guide shows how to run lean_spec as a consensus node using Docker.
- Docker installed
- Genesis file in the proper format (see below)
# Build test image (for running pytest)
docker build -t lean-spec:test .
# Build node image (for running consensus node)
docker build --target node -t lean-spec:node .
# Build dev image (for development)
docker build --target development -t lean-spec:dev .The node expects a YAML genesis file (config.yaml) with this format:
GENESIS_TIME: 1766620797
GENESIS_VALIDATORS:
- "0xb4b1bd5c9e770811cfc54951ee396e0b423dd06a3d889a427cd28653d7f8a55eb161047b926bef60c6ed7231e38e9432e00e6547"
- "0x10f8dd53e8ebbf36b4fc2b16bb9f5a30bf2aee6c3874c836a2060e32ed49f06704aa4b2a5cc86c533fb7d06fa1e73b69d9d98710"
# ... more validatorsAll examples pass CLI arguments directly to the node. Simply append arguments after the image name.
Run a node that syncs but doesn't validate:
docker run --rm \
-v /path/to/genesis:/app/data:ro \
-p 9000:9000 \
lean-spec:node \
--genesis /app/data/config.yamlConnect to an existing network:
docker run --rm \
-v /path/to/genesis:/app/data:ro \
-p 9001:9001 \
lean-spec:node \
--genesis /app/data/config.yaml \
--bootnode /ip4/127.0.0.1/tcp/9000 \
--listen /ip4/0.0.0.0/tcp/9001Connect to multiple peers:
docker run --rm \
-v /path/to/genesis:/app/data:ro \
-p 9000:9000 \
lean-spec:node \
--genesis /app/data/config.yaml \
--bootnode /ip4/192.168.1.10/tcp/9000 \
--bootnode /ip4/192.168.1.11/tcp/9000 \
--bootnode enr:-IS4QHCYrYZbAKW...Run as a validator with keys:
docker run --rm \
-v /path/to/genesis:/app/data:ro \
-v /path/to/keys:/app/keys:ro \
-p 9010:9010 \
lean-spec:node \
--genesis /app/data/config.yaml \
--validator-keys /app/keys \
--node-id lean_spec_0 \
--bootnode /ip4/127.0.0.1/tcp/9000 \
--listen /ip4/0.0.0.0/tcp/9010Fast sync from a finalized checkpoint:
docker run --rm \
-v /path/to/genesis:/app/data:ro \
-v /path/to/keys:/app/keys:ro \
-p 9020:9020 \
--add-host=host.docker.internal:host-gateway \
lean-spec:node \
--genesis /app/data/config.yaml \
--checkpoint-sync-url http://host.docker.internal:5052 \
--validator-keys /app/keys \
--node-id lean_spec_0 \
--listen /ip4/0.0.0.0/tcp/9020Enable debug logs:
docker run --rm \
-v /path/to/genesis:/app/data:ro \
-p 9000:9000 \
lean-spec:node \
--genesis /app/data/config.yaml \
-vRun as a background service:
docker run -d \
--name lean-spec-node \
--restart unless-stopped \
-v /path/to/genesis:/app/data:ro \
-p 9000:9000 \
lean-spec:node \
--genesis /app/data/config.yaml \
--bootnode /ip4/127.0.0.1/tcp/9000
# Check logs
docker logs -f lean-spec-node
# Stop
docker stop lean-spec-nodeIf you have the lean-quickstart repo with generated genesis:
# For local-devnet
docker run --rm \
-v /path/to/lean-quickstart/local-devnet/genesis:/app/data:ro \
-p 9000:9000 \
lean-spec:node \
--genesis /app/data/config.yaml \
--validator-keys /app/data \
--node-id lean_spec_0
# For ansible-devnet
docker run --rm \
-v /path/to/lean-quickstart/ansible-devnet/genesis:/app/data:ro \
-p 9000:9000 \
lean-spec:node \
--genesis /app/data/config.yaml \
--validator-keys /app/data \
--node-id lean_spec_0| Argument | Description | Required |
|---|---|---|
--genesis PATH |
Path to genesis YAML file (config.yaml) | Yes |
--bootnode ADDR |
Bootnode multiaddr or ENR (can be specified multiple times) | No |
--listen ADDR |
Multiaddr to listen on (default: /ip4/0.0.0.0/tcp/9000) |
No |
--checkpoint-sync-url URL |
URL for checkpoint sync (e.g., http://host:5052) |
No |
--validator-keys PATH |
Path to validator keys directory | No |
--node-id ID |
Node identifier for validator assignment (default: lean_spec_0) |
No |
-v, --verbose |
Enable debug logging | No |
Run docker run lean-spec:node --help to see all available options.
You may need to rebuild the image. The Dockerfile now includes LICENSE and README.md.
- Check that the bootnode is reachable from the container
- Use
host.docker.internalto access services on the host machine - Add
--add-host=host.docker.internal:host-gatewayif needed
Change the port mapping: -p 9001:9000 (host:container)
Or change the listen address: --listen /ip4/0.0.0.0/tcp/9001