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を試す

helloworldコンテナを試した

ngrokの代わりにinletsを使う

固定ドメインが設定できるのでbot開発に便利

inletsで複数ドメインが使えるようにする

CaddyのCloudflare Pluginを使ってワイルドカード証明書を設定した

gcloud configでアカウントを切り替える

gcloud config configurations activateで切り替える

Cloud RunアプリをCloud Buildでデプロイできるようにする

特定のブランチにpushしたらデプロイできるようになった

Cloud Buildの結果をSlackに通知する

公式ドキュメントの手順に沿って設定