DockerでFirestoreのエミュレータを動かす


環境

  • OS: Arch Linux
  • Docker: 19.03.12-ce build 48a66213fe

ファイル

Dockerfile
FROM node:12

RUN yarn global add firebase-tools && \
    firebase setup:emulators:firestore && \
    wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add - && \
    apt update && \
    apt install -y software-properties-common apt-transport-https && \
    add-apt-repository -y https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ && \
    apt update && \
    apt install -y adoptopenjdk-11-hotspot

COPY conf/firebase.json .

CMD [ "firebase", "emulators:start", "--only", "firestore" ]
conf/firebase.json
{
  "emulators": {
    "firestore": {
      "host": "0.0.0.0"
    }
  }
}

解説

firebase-tools のインストールと設定

firebase コマンドを利用するためにはnpmパッケージである firebase-tools をインストールしなければなりません。
なので、 yarn global add firebase-tools として firebase-tools をインストールしています。

また、 Firebase の Firestore エミュレータ機能を設定するために firebase setup:emulators:firestore を実行しています。

Java のインストール

Firestore のエミュレータを動かすためには Java が必要となるので、 AdoptOpenJDK をインストールします。

まず、GPGキーをインポートします。

wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -

続いて、パッケージリストを更新して、 apt-add-repository を実行するために必要な software-properties-common とHTTPSリポジトリにアクセスするために必要な apt-transport-https をインストールします。

apt update
apt install -y software-properties-common apt-transport-https

最後にAPTリポジトリの追加とパッケージリストの更新を行って、 AdoptOpenJDK をインストールします。

add-apt-repository -y https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
apt update
apt install -y adoptopenjdk-11-hotspot

設定ファイルの配置

このままでもエミュレータを起動することは出来ます。
しかし、ホストが localhost になっているため、このコンテナ内からしかアクセス出来ません。

ホストや他コンテナからアクセスするためには、ホストを 0.0.0.0 としなければなりません。
なので、 firebase.json を用いてホストを設定します。

firebase.json
{
  "emulators": {
    "firestore": {
      "host": "0.0.0.0"
    }
  }
}

これをCOPYによってカレントディレクトリに配置しています。

実行

あとは firebase emulators:start --only firestore をCMDによって実行させると起動します。

⚠  emulators: You are not currently authenticated so some features may not work correctly. Please run firebase login to authenticate the CLI.
i  emulators: Starting emulators: firestore
⚠  firestore: Did not find a Cloud Firestore rules file specified in a firebase.json config file.
⚠  firestore: The emulator will default to allowing all reads and writes. Learn more about this option: https://firebase.google.com/docs/emulator-suite/install_and_configure#security_rules_configuration.
i  firestore: Firestore Emulator logging to firestore-debug.log

┌──────────────────────────────────────────────────────────────┐
│ ✔  All emulators ready! It is now safe to connect your apps. │
└──────────────────────────────────────────────────────────────┘

┌───────────┬──────────────┐
│ Emulator  │ Host:Port    │
├───────────┼──────────────┤
│ Firestore │ 0.0.0.0:8080 │
└───────────┴──────────────┘
  Other reserved ports: 

Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.