Added spanner emulator as DB

This commit is contained in:
Nik Afiq 2025-08-23 13:46:23 +09:00
parent 3a73916d91
commit c22c033e73
4 changed files with 79 additions and 0 deletions

View File

@ -0,0 +1,19 @@
.PHONY: up down down-volume logs ps
up:
docker compose up -d spanner
init:
docker compose up -d spanner-init
down:
docker compose down
down-volume:
docker compose down -v
ps:
docker compose ps
logs:
docker compose logs -f

View File

@ -0,0 +1,7 @@
CREATE TABLE item_stock (
id STRING(36) NOT NULL DEFAULT (GENERATE_UUID()),
name STRING(100),
amount INT64,
price NUMERIC,
sales_amount INT64
) PRIMARY KEY (id);

View File

@ -0,0 +1,23 @@
services:
spanner:
image: gcr.io/cloud-spanner-emulator/emulator:latest
container_name: spanner-emulator
ports:
- "9010:9010" # gRPC
- "9020:9020" # REST
spanner-init:
image: google/cloud-sdk:slim
container_name: spanner-init
depends_on:
- spanner
env_file:
- .env
environment:
# Tell gcloud/client libs to talk to the emulator inside the network
- SPANNER_EMULATOR_HOST=spanner:9010
volumes:
- ./scripts/spanner-init.sh:/work/spanner-init.sh:ro
- ./ddl:/work/ddl:ro
working_dir: /work
entrypoint: [ "bash", "/work/spanner-init.sh" ]

30
scripts/spanner-init.sh Normal file → Executable file
View File

@ -0,0 +1,30 @@
#!/usr/bin/env bash
set -euo pipefail
: "${SPANNER_PROJECT:?}"
: "${SPANNER_INSTANCE:?}"
: "${SPANNER_DATABASE:?}"
# 1) Wait for emulator gRPC port (inside compose network it's "spanner:9010")
for _ in $(seq 1 60); do
(echo >/dev/tcp/spanner/9010) >/dev/null 2>&1 && break
sleep 1
done
# 2) Point gcloud to the emulator (disable real IAM)
export SPANNER_EMULATOR_HOST=spanner:9010
gcloud config set auth/disable_credentials true >/dev/null
gcloud config set core/project "${SPANNER_PROJECT}" >/dev/null
gcloud config set api_endpoint_overrides/spanner http://spanner:9020/ >/dev/null
# 3) Create instance & database (idempotent)
gcloud spanner instances create "${SPANNER_INSTANCE}" \
--config=emulator-config --nodes=1 --description="Dev" >/dev/null 2>&1 || true
gcloud spanner databases create "${SPANNER_DATABASE}" \
--instance="${SPANNER_INSTANCE}" >/dev/null 2>&1 || true
# 4) Apply DDL
gcloud spanner databases ddl update "${SPANNER_DATABASE}" \
--instance="${SPANNER_INSTANCE}" \
--ddl-file="/work/ddl/schema.sql" >/dev/null