💨
CloudSpannerとPubSubのエミュレータを動かす
単体環境で動作確認したい時にはDockerなどのコンテナを使います。claudeで.ymlを生成するとうまく動かない設定になったため、取り急ぎ動くように修正しました。
docker-compose.yml
version: '3.8'
services:
spanner-emulator:
image: gcr.io/cloud-spanner-emulator/emulator:latest
ports:
- "9010:9010"
- "9020:9020"
pubsub-emulator:
image: gcr.io/google.com/cloudsdktool/cloud-sdk:emulators
command: gcloud beta emulators pubsub start --host-port=0.0.0.0:8085 --project=test-project
ports:
- "8085:8085"
spanner-init:
image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest
environment:
- SPANNER_EMULATOR_HOST=spanner-emulator:9010
volumes:
- ../db/migrations:/migrations:ro
entrypoint: ["/bin/bash", "-c"]
command:
- |
echo "Waiting for Spanner emulator..."
until (echo > /dev/tcp/spanner-emulator/9010) >/dev/null 2>&1; do
echo "Emulator is unavailable - sleeping"
sleep 1
done
set -e
echo "Creating Spanner instance and database..."
gcloud config set auth/disable_credentials true
gcloud config set project test-project
gcloud config set api_endpoint_overrides/spanner http://spanner-emulator:9020/
# Create instance
gcloud spanner instances create test-instance \
--config=emulator-config \
--description="Test Instance" \
--nodes=1 || true
# Create database
gcloud spanner databases create test-database \
--instance=test-instance || true
# Apply schema
echo "Applying schema..."
gcloud spanner databases ddl update test-database \
--instance=test-instance \
--ddl="$$(cat /migrations/001_initial.sql)"
echo "Spanner initialization complete!"
api-server:
build:
context: ..
dockerfile: docker/Dockerfile.server
ports:
- "8080:8080"
environment:
- PORT=8080
- GCP_PROJECT_ID=test-project
- SPANNER_INSTANCE_ID=test-instance
- SPANNER_DATABASE_ID=test-database
- SPANNER_EMULATOR_HOST=spanner-emulator:9010
depends_on:
spanner-init:
condition: service_completed_successfully
restart: unless-stopped
当初はヘルスチェックを作ったりこね回してたんですが depends_on で制御することで、Spannerが綺麗に起動してからAPIを起動し始めるように順番を制御します。。
Discussion