Sign inSign up

floci/floci-oci

Sponsored OSS

By Floci

Updated about 2 hours ago

Light, fluffy, and always free - Local Oracle Cloud Emulator

Image
3

10K+

floci/floci-oci repository overview

floci-oci

floci-oci

Any Cloud. Locally.
Light, fluffy, and always free: the Oracle Cloud local emulator

Latest Release Docker Pulls License: MIT Stars


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.

EmulatorCloudPort
flociAWS4566
floci-azAzure4577
floci-gcpGCP4588
floci-ociOCI4599

Quick Start

# 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 OCI wire protocols

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).

Services

CategoryServices
IdentityCompartments, users, groups, memberships, policies, availability domains, regions, region subscriptions, tenancies
StorageObject Storage: namespaces, buckets, objects, listing, rename, copy, batch delete, multipart uploads, pre-authenticated requests
MessagingQueue (visibility timeouts, DLQs, channels), Streaming (partitioned log, cursors, consumer groups)
SecurityVault and KMS (vaults, keys, key versions, real AES-GCM / RSA / ECDSA crypto), Secrets and secret bundles
ServerlessFunctions: applications, functions, real invocation through an Fn Project sidecar
KubernetesContainer Engine for Kubernetes (OKE): clusters, node pools, options, kubeconfig generation, work requests, real k3s sidecar
Async operationsWork requests, partitioned per service

Full operation-level detail: floci.io/floci-oci/services

Real Docker where fidelity matters:

ServiceDefault imageWhat is real
Functionsfnproject/fnserver:latestThe open-source engine OCI Functions is built on. Your function image runs for real as a sibling container over the FDK http-stream contract
OKErancher/k3s:v1.30.1-k3s1A 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.

Terraform and OpenTofu

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.

Compatibility Testing

ModuleLanguage / ToolTests
sdk-test-cliOCI CLI 3.89.3, all 8 services54
sdk-test-javaoci-java-sdk20
sdk-test-pythonPython oci SDK20
compat-terraformTerraform, oracle/oci provider6
compat-opentofuOpenTofu, oracle/oci provider6
sdk-test-gooci-go-sdk (OKE focus)1

107 automated compatibility tests across 4 SDKs, the OCI CLI, and 2 IaC tools.

Configuration

VariableDefaultDescription
FLOCI_OCI_PORT4599Port exposed by the API
FLOCI_OCI_DEFAULT_REGIONus-ashburn-1Region used in OCIDs and reference data
FLOCI_OCI_DEFAULT_REALMoc1Realm key used when minting OCIDs
FLOCI_OCI_DEFAULT_TENANCY_IDocid1.tenancy.oc1..flocilocal…Tenancy used for unsigned requests
FLOCI_OCI_DEFAULT_NAMESPACEfloci-localObject Storage namespace
FLOCI_OCI_BASE_URLhttp://localhost:4599Base URL for returned service URLs
FLOCI_OCI_HOSTNAME(unset)Hostname in returned URLs (Docker Compose)
FLOCI_OCI_STORAGE_MODEmemorymemory, persistent, hybrid, or wal
FLOCI_OCI_STORAGE_PERSISTENT_PATH./dataDirectory for persisted state
FLOCI_OCI_AUTH_REQUIRE_SIGNATUREfalseReject unsigned requests with 401 NotAuthenticated
FLOCI_OCI_TLS_ENABLEDfalseServe 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.

Image Tags

ChannelStandardWith OCI CLI and Python SDK
Release, floatinglatestlatest-compat
Release, pinnedx.y.zx.y.z-compat
Nightlynightly, nightly-mmddyyyynightly-compat

Stable releases ship on the 1st and 3rd Tuesday of each month. nightly tracks main.

Resources

License

MIT. Use it however you want.

Tag summary

Content type

Image

Digest

sha256:58b4b1706

Size

38 MB

Last updated

5 days ago

docker pull floci/floci-oci

This week's pulls

Pulls:

1,085

Last week