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 FunctionsのNode.jsバージョンを更新する

package.jsonとcloudbuild.yamlを更新

Cloud BuildでFirebase Hostingのデプロイを行う

リポジトリへのpush以外をトリガーにしたい場合に使用

Firebase HostingのデプロイをWebhook(API)経由で行う

デプロイボタンが作れるようになった

CloudRunでnode.jsを動かす

リポジトリにpushしたらCloudRun上に自動デプロイ

IPv6 IPoE環境で自宅のRaspberryPiにsshできるようにする

GCPにssh port forwardingすることで実現できた