From c22c033e730aecce2c00228a1e65df217156b414 Mon Sep 17 00:00:00 2001 From: Nik Afiq Date: Sat, 23 Aug 2025 13:46:23 +0900 Subject: [PATCH] Added spanner emulator as DB --- Makefile | 19 +++++++++++++++++++ ddl/schema.sql | 7 +++++++ docker-compose.yml | 23 +++++++++++++++++++++++ scripts/spanner-init.sh | 30 ++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+) mode change 100644 => 100755 scripts/spanner-init.sh diff --git a/Makefile b/Makefile index e69de29..43e3fdc 100644 --- a/Makefile +++ b/Makefile @@ -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 \ No newline at end of file diff --git a/ddl/schema.sql b/ddl/schema.sql index e69de29..b88c43c 100644 --- a/ddl/schema.sql +++ b/ddl/schema.sql @@ -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); \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index e69de29..6d24dd1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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" ] \ No newline at end of file diff --git a/scripts/spanner-init.sh b/scripts/spanner-init.sh old mode 100644 new mode 100755 index e69de29..8e73bb1 --- a/scripts/spanner-init.sh +++ b/scripts/spanner-init.sh @@ -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 \ No newline at end of file