Cloud Datastoreのローカル環境をDockerで構築する

公開日時
更新日時

Cloud Runで動かすアプリを作る際にデータの永続化がしたかったので、Cloud Datastoreを使うことにした。

CloudSQLという手も検討したが、Cloud Datastoreには無料枠があるのでこちらを利用することに。

Cloud Datastoreエミュレータを使うとローカルでもCloud Datastoreが使えるとのことだったので、Dockerで環境を作ることにした。

Cloud Datastoreエミュレータ

  • 専用のディレクトリを作成
mkdir -p docker/gcloud
  • 起動用シェルスクリプト(docker/gcloud/start.sh)を追加
#!/bin/sh

gcloud config set project ${DATASTORE_PROJECT_ID}

gcloud beta emulators datastore start \
  --data-dir=/opt/data \
  --host-port=${DATASTORE_LISTEN_ADDRESS} \
  ${options}
  • 実行権限を付与
chmod +x docker/gcloud/start.sh
  • Dockerfileを作成
FROM google/cloud-sdk:alpine

RUN apk add --update --no-cache openjdk8-jre &&\
gcloud components install cloud-datastore-emulator beta --quiet

VOLUME /opt/data

COPY start.sh .

ENTRYPOINT ["./start.sh"]
  • docker-compose.ymlを設定
version: "3"
services:
  gcloud:
    build:
      context: ./docker/gcloud
      dockerfile: Dockerfile
    tty: true
    environment:
      DATASTORE_PROJECT_ID: app
      DATASTORE_LISTEN_ADDRESS: 0.0.0.0:8081
    ports:
      - "8081:8081"
  • ビルドと起動
docker-compose build
docker-compose up

これで http://localhost:8081 でCloudDatastoreエミュレータが動くようになった。

google-cloud-gui

Datastoreの内容をGUIで確認できるgoogle-cloud-guiも合わせて設定する。

  • 専用のディレクトリを作成
mkdir -p docker/gcloud_gui
  • package.jsonを追加
// docker/gcloud_gui/package.json
{
  "name": "gcloud_gui",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "google-cloud-gui": "^0.2.2"
  }
}
  • yarn.lockを追加
touch docker/gcloud_gui/yarn.lock
  • Dockerfileを作成
FROM node:12.14-alpine

WORKDIR /app

COPY package.json yarn.lock /app/

RUN yarn install

COPY google-cloud-gui-db.json /root/.google-cloud-gui-db.json

CMD [ "yarn", "run", "google-cloud-gui", "--skip-browser" ]
  • 設定ファイルを追加
// docker/gcloud_gui/google-cloud-gui-db.json
{
  "projects": [
    {
      "service": "datastore",
      "projectId": "app",
      "apiEndpoint": "http://gcloud:8081",
      "id": "default"
    }
  ]
}
  • docker-compose.ymlを設定
version: "3"
services:
  gcloud_gui:
    build:
      context: ./docker/gcloud_gui
      dockerfile: Dockerfile
    ports:
      - "8082:8000"
    depends_on: 
      - gcloud
    logging:
      driver: none

issueに挙がっている「Can't set headers after they are sent · Issue #7」がログに出ていたので、環境変数を正しく設定したものの変化がなかったのでログを非表示にした。

データを閲覧すること自体は問題なくできているのでひとまずは良しとする。

  • ビルドと起動
docker-compose build
docker-compose up

これで http://localhost:8082 でgoogle-cloud-guiが動くようになった。

参考


Related #gcp

Cloud Runのコールドスタートを避けるためにcurlで起こし続ける

定期リクエストを送っている間はコールドスタートは発生していないことが確認できた

GCP VMインスタンスのSSHポートを変更した

Network Internet Egress from Americas to EMEA

[Action Required] Internal error has affected services in Cloud Run that use Cloud Load Balancing

デフォルトURLで利用している場合は対応不要

GCPの無料インスタンスがF1-microからE2-Microに変わった

メールが来ていたのを見落としていた

ローカルディレクトリをCloud Storageに同期する

gsutil rsyncを利用した