💨

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