Skip to content

Instantly share code, notes, and snippets.

@martyngigg
Last active July 17, 2025 14:19
Show Gist options
  • Select an option

  • Save martyngigg/651f16a8b2f1d7e3946ddda8a61527cb to your computer and use it in GitHub Desktop.

Select an option

Save martyngigg/651f16a8b2f1d7e3946ddda8a61527cb to your computer and use it in GitHub Desktop.
Minimal Lakekeeper docker compose example using non-empty prefixed path
{
"warehouse-name": "demo",
"project-id": "00000000-0000-0000-0000-000000000000",
"storage-profile": {
"type": "s3",
"bucket": "examples",
"key-prefix": "initial-warehouse",
"assume-role-arn": null,
"endpoint": "http://minio:9000",
"region": "local-01",
"path-style-access": true,
"flavor": "minio",
"sts-enabled": true
},
"storage-credential": {
"type": "s3",
"credential-type": "access-key",
"aws-access-key-id": "minio-root-user",
"aws-secret-access-key": "minio-root-password"
}
}
services:
traefik:
image: traefik:v3.4
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
ports:
- "8088:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.yml:/etc/traefik/traefik.yml
- ./traefik-dynamic.yml:/etc/traefik/traefik-dynamic.yml
networks:
iceberg_net:
whoami:
image: traefik/whoami
networks:
iceberg_net:
lakekeeper:
image: quay.io/lakekeeper/catalog:latest
pull_policy: always
environment:
- LAKEKEEPER__PG_ENCRYPTION_KEY=This-is-NOT-Secure!
- LAKEKEEPER__PG_DATABASE_URL_READ=postgresql://postgres:postgres@db:5432/postgres
- LAKEKEEPER__PG_DATABASE_URL_WRITE=postgresql://postgres:postgres@db:5432/postgres
- RUST_LOG=trace,axum=trace,sqlx=trace,lakekeeper=trace,lakekeeper-bin=trace
command: ["serve"]
healthcheck:
test: ["CMD", "/home/nonroot/lakekeeper", "healthcheck"]
interval: 1s
timeout: 10s
retries: 3
start_period: 3s
depends_on:
migrate:
condition: service_completed_successfully
db:
condition: service_healthy
minio:
condition: service_healthy
networks:
iceberg_net:
ports:
- "8181:8181"
migrate:
image: quay.io/lakekeeper/catalog:latest
pull_policy: always
environment:
- LAKEKEEPER__PG_ENCRYPTION_KEY=This-is-NOT-Secure!
- LAKEKEEPER__PG_DATABASE_URL_READ=postgresql://postgres:postgres@db:5432/postgres
- LAKEKEEPER__PG_DATABASE_URL_WRITE=postgresql://postgres:postgres@db:5432/postgres
- RUST_LOG=info
restart: "no"
command: ["migrate"]
depends_on:
db:
condition: service_healthy
networks:
iceberg_net:
bootstrap:
image: curlimages/curl
depends_on:
lakekeeper:
condition: service_healthy
restart: "no"
command:
- -w
- "%{http_code}"
- "-X"
- "POST"
- "-v"
- "http://lakekeeper:8181/management/v1/bootstrap"
- "-H"
- "Content-Type: application/json"
- "--data"
- '{"accept-terms-of-use": true}'
- "-o"
- "/dev/null"
networks:
iceberg_net:
initialwarehouse:
image: curlimages/curl
depends_on:
lakekeeper:
condition: service_healthy
bootstrap:
condition: service_completed_successfully
restart: "no"
command:
- -w
- "%{http_code}"
- "-X"
- "POST"
- "-v"
- "http://lakekeeper:8181/management/v1/warehouse"
- "-H"
- "Content-Type: application/json"
- "--data"
- "@create-default-warehouse.json"
- "-o"
- "/dev/null"
volumes:
- ./create-default-warehouse.json:/home/curl_user/create-default-warehouse.json
networks:
iceberg_net:
db:
image: bitnami/postgresql:16.3.0
environment:
- POSTGRESQL_USERNAME=postgres
- POSTGRESQL_PASSWORD=postgres
- POSTGRESQL_DATABASE=postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -p 5432 -d postgres"]
interval: 2s
timeout: 10s
retries: 2
start_period: 10s
networks:
iceberg_net:
minio:
image: bitnami/minio:latest
environment:
- MINIO_ROOT_USER=minio-root-user
- MINIO_ROOT_PASSWORD=minio-root-password
- MINIO_API_PORT_NUMBER=9000
- MINIO_CONSOLE_PORT_NUMBER=9001
- MINIO_SCHEME=http
- MINIO_DEFAULT_BUCKETS=examples
healthcheck:
test: ["CMD", "mc", "ls", "local", "|", "grep", "examples"]
interval: 2s
timeout: 10s
retries: 2
start_period: 15s
networks:
iceberg_net:
ports:
- "9000:9000"
- "9001:9001"
networks:
iceberg_net:
http:
routers:
whoami:
entryPoints: web
rule: PathPrefix(`/whoami`)
service: whoami
middlewares:
- whoami-strip-prefix
lakekeeper:
entryPoints: web
rule: PathPrefix(`/lakekeeper`)
service: lakekeeper
middlewares:
- lakekeeper-strip-prefix
middlewares:
lakekeeper-strip-prefix:
stripPrefix:
prefixes:
- "/lakekeeper"
whoami-strip-prefix:
stripPrefix:
prefixes:
- "/whoami"
services:
lakekeeper:
loadBalancer:
servers:
- url: "http://lakekeeper:8181"
whoami:
loadBalancer:
servers:
- url: "http://whoami"
log:
level: DEBUG
api:
insecure: true
entryPoints:
web:
address: ":80"
providers:
file:
filename: /etc/traefik/traefik-dynamic.yml
watch: true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment