LoginSignup
3
4

More than 5 years have passed since last update.

Cloud Datastore Emulator を Node.js から Docker コンテナ間で接続利用する

Last updated at Posted at 2019-05-09

docker-compose を利用して、なるべくミニマムな作りにしようと。。。
するも、まぁまぁ大仰しい感じになってしまった。

ディレクトリ構成

.
├── .env
├── containers
│   ├── gcloud
│   │   ├── Dockerfile
│   │   └── datastore.sh
│   └── node
│       └── Dockerfile
├── docker-compose.yml
└── src
    ├── client
    │   ├── package.json
    │   └── src
    └── server
        ├── package.json
        └── src

こんなノリ

gcloud 用コンテナ

公式のSDKイメージから。最小限で。
エミュレータ起動用shellに実行権限付与。

## ./containers/gcloud/Dockerfile

FROM google/cloud-sdk:latest

ADD datastore.sh /datastore.sh
RUN chmod +x /datastore.sh

エミュレータ起動用 shell

gcloudのコンテナ内で、datastoreのエミュレータを立ち上げる起動式。

$DATASTORE_PROJECT_ID は .env から。

オプションなしで起動すると、コンテナ内でしかアクセスできないので、
--host-port=0.0.0.0:8081 として起動。

これで別コンテナ(node)からもアクセスできるようになる。

エミュレータで使う分には、gcloudのprojectのconfigだけセットしてあればいい。
(gcloud auth loginとか特にいらない)

## ./containers/gcloud/datastore.sh

#!/bin/sh

gcloud config set project $DATASTORE_PROJECT_ID
gcloud beta emulators datastore start --host-port=0.0.0.0:8081

Node.js 用コンテナ

こちらも公式のイメージから最小限で。

## ./containers/node/Dockerfile

FROM node:10

RUN npm -g config set user root

# 必要あればglobalの依存ライブラリインストール
RUN npm i -g typescript
RUN npm i -g @angular/cli@7.3.9

docker-compose.yaml

## ./docker-compose.yaml

version: '3'

services:
  gcloud:
    build: ${COMPOSE_PROJECT_ROOT}/containers/gcloud
    tty: true
    environment:
      - DATASTORE_PROJECT_ID=${DATASTORE_PROJECT_ID}
    volumes:
      - ${COMPOSE_PROJECT_ROOT}/src:/src:cached
  node:
    build: ${COMPOSE_PROJECT_ROOT}/containers/node
    tty: true
    working_dir: /src
    volumes:
      - ${COMPOSE_PROJECT_ROOT}/src:/src:cached
    environment:
      - DATASTORE_EMULATOR_HOST=${DATASTORE_EMULATOR_HOST}
      - DATASTORE_PROJECT_ID=${DATASTORE_PROJECT_ID}
    ports:
      - '80:8080' # for web
      - '8082:8000' # for google-cloud-gui
      - '8080:4200' # for angular serve
  • services:
    • gcloud, node をサービスとして用意。
  • tty:true
    • どちらもコンテナ内にて作業したいので
  • ${COMPOSE_PROJECT_ROOT} .envから
    • mac/win 用にプロジェクトルートの相対/絶対パスを指定してる。
  • volumes:
    • gcloud側からsrc見たりする必要があるのならマウントしたり。
  • node:ports:
    • ホスト機との接続用にexposeする(必要あれば)
  • gcloud:environment:-DATASTORE_PROJECT_ID
    • エミュレータのプロジェクトID指定用に
  • node:environment:-DATASTORE_EMULATOR_HOST
  • node:environment:-DATASTORE_PROJECT_ID
    • エミュレータへの接続用に

コンテナ用環境変数 .env

## ./.env

### Datastore Emulator
DATASTORE_EMULATOR_HOST=gcloud:8081
DATASTORE_PROJECT_ID=ideodora-sandbox001

DATASTORE_EMULATOR_HOST=gcloud:8081
nodeコンテナ側から見た、エミュレータへの接続用ホスト+ポート

DATASTORE_PROJECT_ID=ideodora-sandbox001
任意のgcpプロジェクト名

コンテナ起動

docker-compose up -d

楽チン

エミュレータの起動

docker-compose exec gcloud bash
./datastore.sh

これで、nodeからはgcloud:8081で繋ぎに行ける。

node側

docker-compose exec node bash

npm i @google-cloud/datastore

で、あとは環境変数で接続用の値が入ってるので、

## ./src/server/index.ts

import { Datastore } from '@google-cloud/datastore';

const datastore = new Datastore();

と、特にprojectIdだったりなんなりをDatastoreのオプションに渡すことなく、エミュレータに接続できる。

おまけ

エミュレータのdatastoreに保存したデータをのぞき見できるライブラリが便利でよく使ってる。
npm: google-cloud-gui

docker-compose exec node bash

npm i google-cloud-gui

google-cloud-gui --skip-browser

で、起動して、ブラウザから、 http://localhost:8082 にアクセスして
datastoreの保存データをweb上のguiで見れたりできるので便利。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4