Docker Compose
Minimal Setup
For most services (SSM, SQS, SNS, S3, DynamoDB, Lambda, API Gateway, Cognito, KMS, Kinesis, Secrets Manager, CloudFormation, Step Functions, IAM, STS, EventBridge, CloudWatch) a single port is enough:
services:
floci:
image: hectorvent/floci:latest
ports:
- "4566:4566"
volumes:
- ./data:/app/data
- ./init/start.d:/etc/floci/init/start.d:ro
- ./init/stop.d:/etc/floci/init/stop.d:ro
Full Setup (with ElastiCache and RDS)
ElastiCache and RDS work by proxying TCP connections to real Docker containers (Valkey/Redis, PostgreSQL, MySQL). Those containers' ports must be reachable from your host, so additional port ranges must be exposed:
services:
floci:
image: hectorvent/floci:latest
ports:
- "4566:4566" # All AWS API calls
- "6379-6399:6379-6399" # ElastiCache / Redis proxy ports
- "7001-7099:7001-7099" # RDS / PostgreSQL + MySQL proxy ports
volumes:
- /var/run/docker.sock:/var/run/docker.sock # required for Lambda, ElastiCache, RDS
- ./data:/app/data
environment:
FLOCI_SERVICES_DOCKER_NETWORK: my-project_default # (1)
- Set this to the Docker network name that your compose project creates (usually
<project-name>_default). Floci uses it to attach spawned Lambda / ElastiCache / RDS containers to the same network.
Docker socket
Lambda, ElastiCache, and RDS require access to the Docker socket (/var/run/docker.sock) to spawn and manage containers. If you don't use these services, you can omit that volume.
Initialization Hooks
Hook scripts can be mounted into the container to run custom setup and teardown logic:
services:
floci:
image: hectorvent/floci:latest
ports:
- "4566:4566"
volumes:
- ./init/start.d:/etc/floci/init/start.d:ro
- ./init/stop.d:/etc/floci/init/stop.d:ro
See Initialization Hooks for execution behavior and configuration details.
Persistence
By default Floci stores all data in memory — data is lost on restart. To persist data to disk, set the storage path and enable persistent mode:
services:
floci:
image: hectorvent/floci:latest
ports:
- "4566:4566"
volumes:
- ./data:/app/data
environment:
FLOCI_STORAGE_MODE: persistent
FLOCI_STORAGE_PERSISTENT_PATH: /app/data
Using Named Volumes
Instead of bind-mounting a local directory, you can use Docker named volumes to keep your project directory clean:
services:
floci:
image: hectorvent/floci:latest
ports:
- "4566:4566"
volumes:
- floci-data:/app/data
environment:
FLOCI_STORAGE_MODE: persistent
FLOCI_STORAGE_PERSISTENT_PATH: /app/data
volumes:
floci-data:
Named volumes are managed entirely by Docker and won't create files in your repository. This works with both the JVM and native images.
Environment Variables Reference
All application.yml options can be overridden via environment variables using the FLOCI_ prefix with underscores replacing dots and dashes:
| Environment variable | Default | Description |
|---|---|---|
FLOCI_DEFAULT_REGION |
us-east-1 |
AWS region reported in ARNs |
FLOCI_DEFAULT_ACCOUNT_ID |
000000000000 |
AWS account ID used in ARNs |
FLOCI_STORAGE_MODE |
memory |
Global storage mode (memory, persistent, hybrid, wal) |
FLOCI_STORAGE_PERSISTENT_PATH |
./data |
Directory for persistent storage |
FLOCI_SERVICES_LAMBDA_DOCKER_HOST |
unix:///var/run/docker.sock |
Docker host for Lambda containers |
FLOCI_SERVICES_LAMBDA_EPHEMERAL |
false |
Remove Lambda containers after each invocation |
FLOCI_SERVICES_LAMBDA_DEFAULT_MEMORY_MB |
128 |
Default Lambda memory allocation |
FLOCI_SERVICES_LAMBDA_DEFAULT_TIMEOUT_SECONDS |
3 |
Default Lambda timeout |
FLOCI_SERVICES_LAMBDA_CODE_PATH |
./data/lambda-code |
Where Lambda ZIPs are stored |
FLOCI_SERVICES_ELASTICACHE_PROXY_BASE_PORT |
6379 |
First ElastiCache proxy port |
FLOCI_SERVICES_ELASTICACHE_PROXY_MAX_PORT |
6399 |
Last ElastiCache proxy port |
FLOCI_SERVICES_ELASTICACHE_DEFAULT_IMAGE |
valkey/valkey:8 |
Default Redis/Valkey Docker image |
FLOCI_SERVICES_RDS_PROXY_BASE_PORT |
7001 |
First RDS proxy port |
FLOCI_SERVICES_RDS_PROXY_MAX_PORT |
7099 |
Last RDS proxy port |
FLOCI_SERVICES_RDS_DEFAULT_POSTGRES_IMAGE |
postgres:16-alpine |
Default PostgreSQL image |
FLOCI_SERVICES_RDS_DEFAULT_MYSQL_IMAGE |
mysql:8.0 |
Default MySQL image |
FLOCI_SERVICES_RDS_DEFAULT_MARIADB_IMAGE |
mariadb:11 |
Default MariaDB image |
FLOCI_SERVICES_DOCKER_NETWORK |
(none) | Docker network to attach spawned containers |
FLOCI_AUTH_VALIDATE_SIGNATURES |
false |
Verify AWS request signatures |