Light, fluffy, and always free - Local Oracle Cloud Emulator
10K+
Any Cloud. Locally.
Light, fluffy, and always free: the Oracle Cloud local emulator
A free, open-source local Oracle Cloud Infrastructure emulator for development, testing, and CI. No account. No API key ceremony. No feature gates.
Oracle Cloud has no official local emulator. Testing OCI integrations means a real tenancy, real credentials, and real network round-trips, even in CI. floci-oci fills that gap: one container, one port, real wire protocols.
| Emulator | Cloud | Port |
|---|---|---|
| floci | AWS | 4566 |
| floci-az | Azure | 4577 |
| floci-gcp | GCP | 4588 |
| floci-oci | OCI | 4599 |
# compose.yaml
services:
floci-oci:
image: floci/floci-oci:latest
ports:
- "4599:4599"
docker compose up
oci os ns get --endpoint http://localhost:4599
oci os bucket create --endpoint http://localhost:4599 \
--compartment-id ocid1.tenancy.oc1..flocilocaltenancy0000000000000000000000000000000000000000 \
--namespace floci-local --name my-bucket
Any locally generated API key works. floci-oci parses the request signature for tenancy and user context but never verifies it. The latest-compat image bundles the OCI CLI, the Python SDK, and a throwaway key, so docker exec floci-oci ocilocal os ns get works with zero setup.
Real request and response shapes: opc-request-id on every response, opc-next-page pagination headers, etag and if-match conditional requests, OCIDs, work requests for async operations, and OCI's exact error bodies (NotAuthorizedOrNotFound, BucketNotFound).
| Category | Services |
|---|---|
| Identity | Compartments, users, groups, memberships, policies, availability domains, regions, region subscriptions, tenancies |
| Storage | Object Storage: namespaces, buckets, objects, listing, rename, copy, batch delete, multipart uploads, pre-authenticated requests |
| Messaging | Queue (visibility timeouts, DLQs, channels), Streaming (partitioned log, cursors, consumer groups) |
| Security | Vault and KMS (vaults, keys, key versions, real AES-GCM / RSA / ECDSA crypto), Secrets and secret bundles |
| Serverless | Functions: applications, functions, real invocation through an Fn Project sidecar |
| Kubernetes | Container Engine for Kubernetes (OKE): clusters, node pools, options, kubeconfig generation, work requests, real k3s sidecar |
| Async operations | Work requests, partitioned per service |
Full operation-level detail: floci.io/floci-oci/services
Real Docker where fidelity matters:
| Service | Default image | What is real |
|---|---|---|
| Functions | fnproject/fnserver:latest | The open-source engine OCI Functions is built on. Your function image runs for real as a sibling container over the FDK http-stream contract |
| OKE | rancher/k3s:v1.30.1-k3s1 | A real local Kubernetes cluster, dynamic host ports (6443..6543) and a named data volume |
Set FLOCI_OCI_SERVICES_FUNCTIONS_MOCK=true or FLOCI_OCI_SERVICES_OKE_MOCK=true to skip Docker entirely. The management plane stays fully usable.
Not implemented yet: identity domains, API keys and auth tokens, dynamic groups, tag namespaces, object versioning, retention rules (stubbed empty for Terraform), lifecycle policies, replication, the S3 Compatibility API, queue consumer groups, stream pool Kafka settings, KMS import and backup, secret rotation, and pre-built functions.
The official oracle/oci provider works unchanged through its per-client host overrides. No fork, no wrapper.
export TF_VAR_CLIENT_HOST_OVERRIDES="oci_identity.IdentityClient=http://localhost:4599;oci_object_storage.ObjectStorageClient=http://localhost:4599"
The full apply, plan (zero drift), destroy cycle is validated in CI for both tools.
| Module | Language / Tool | Tests |
|---|---|---|
sdk-test-cli | OCI CLI 3.89.3, all 8 services | 54 |
sdk-test-java | oci-java-sdk | 20 |
sdk-test-python | Python oci SDK | 20 |
compat-terraform | Terraform, oracle/oci provider | 6 |
compat-opentofu | OpenTofu, oracle/oci provider | 6 |
sdk-test-go | oci-go-sdk (OKE focus) | 1 |
107 automated compatibility tests across 4 SDKs, the OCI CLI, and 2 IaC tools.
| Variable | Default | Description |
|---|---|---|
FLOCI_OCI_PORT | 4599 | Port exposed by the API |
FLOCI_OCI_DEFAULT_REGION | us-ashburn-1 | Region used in OCIDs and reference data |
FLOCI_OCI_DEFAULT_REALM | oc1 | Realm key used when minting OCIDs |
FLOCI_OCI_DEFAULT_TENANCY_ID | ocid1.tenancy.oc1..flocilocal… | Tenancy used for unsigned requests |
FLOCI_OCI_DEFAULT_NAMESPACE | floci-local | Object Storage namespace |
FLOCI_OCI_BASE_URL | http://localhost:4599 | Base URL for returned service URLs |
FLOCI_OCI_HOSTNAME | (unset) | Hostname in returned URLs (Docker Compose) |
FLOCI_OCI_STORAGE_MODE | memory | memory, persistent, hybrid, or wal |
FLOCI_OCI_STORAGE_PERSISTENT_PATH | ./data | Directory for persisted state |
FLOCI_OCI_AUTH_REQUIRE_SIGNATURE | false | Reject unsigned requests with 401 NotAuthenticated |
FLOCI_OCI_TLS_ENABLED | false | Serve HTTPS and HTTP on the same port |
Per-service storage overrides use the map form, for example FLOCI_OCI_STORAGE_SERVICES_OBJECTSTORAGE_MODE=wal.
Full reference: floci.io/floci-oci/configuration
Multi-tenancy isolation: the tenancy OCID in your signing key's keyId is the storage partition. Requests signed with different tenancy OCIDs see fully isolated resources. Compartments are the organizational boundary, tenancy is the isolation one.
| Channel | Standard | With OCI CLI and Python SDK |
|---|---|---|
| Release, floating | latest | latest-compat |
| Release, pinned | x.y.z | x.y.z-compat |
| Nightly | nightly, nightly-mmddyyyy | nightly-compat |
Stable releases ship on the 1st and 3rd Tuesday of each month. nightly tracks main.
MIT. Use it however you want.
Content type
Image
Digest
sha256:58b4b1706…
Size
38 MB
Last updated
6 days ago
docker pull floci/floci-ociPulls:
1,085
Last week