Noh | エンジニア向け情報共有コミュニティ
Signup / Login

FirebaseをDocker Composeで動かすメモ

firebase
docker
javascript

投稿日: 2024/06/25

殴り書きですがご勘弁を。
FirebaseというよりDocker周りの話多めかも。

ローカル環境の構築

まずはDockerfile
nodeのイメージをベースにしてJava JDKとFirebase CLIをインストールします。

docker/firebase/Dockerfile

FROM node:16 WORKDIR /app RUN apt-get update && apt-get install default-jre-headless -y RUN npm install -g firebase-tools

次にdocker-compose.yml。
portは必要なやつを足してください。

今回はRailsと同じリポジトリに入れるので、firebaseというディレクトリを切ってます。

このエミュレーターは起動と停止のたびにデータを引き継いでくれないので、停止時にデータをエクスポートして起動時にインポートするようにしています。

docker-compose.yml

version: "3" services: firebase: build: context: . dockerfile: ./docker/firebase/Dockerfile volumes: - ./firebase/:/app/ - ./docker/firebase/bin/:/root/.cache:cached - ./docker/firebase/config/:/root/.config:cached ports: - 9005:9005 # Firebase CLI Login - 9099:9099 # Firebase Authentication - 4000:4000 # Firebase Emulator Suite UI working_dir: /app command: firebase emulators:start --import data --export-on-exit tty: true

Firebaseコマンドでログイン

docker compose upする前にFirebaseコマンドでログインします。
(あんま詳しくないけど、実際のFirebaseプロジェクトから設定を引っ張ってくるのとかに必要なのかな?)

docker compose run --rm firebase firebase login --no-localhost

実行したらURLが表示されるので、ブラウザでアクセスしてログインします。
5ケタの文字列が表示されるのでコンソールに表示されている文字列と同じか確認しましょう。

ボタンを押して進むと認証コードが表示されるのでコンソールに入力しましょう。

Success! Loggedと表示されたら完了です。

初期化してファイルを生成します。

docker compose run --rm firebase firebase initを実行して Emulators: Set up local emulators for Firebase productsを選択します。そのあとはいい感じに進めます。

起動

ここまで来たらdocker compose upできますが、実行されるfirebase emulators:startはコンテナ内のlocalhostでアクセスできます。

本題からそれるので詳しい説明はしないですが、コンテナ内のlocalhostをホストマシン側のlocalhostにポートフォワーディングしようとすると失敗するのでアクセスできません。

確認してみるとホストマシンからはアクセスできないのに、コンテナ内ではアクセスできるのがわかります。

$ curl http://localhost:4000 curl: (52) Empty reply from server
$ docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------------------------------------- my-project_firebase_1 省略 Up 0.0.0.0:4000->4000/tcp ...以下省略 $ docker exec -it my-project_firebase_1 /bin/bash app# curl http://localhost:4000 <!DOCTYPE html> ...以下省略

ちなみに超余談ですが、以下のやり方だとコンテナ内に入ってもアクセスできない(別コンテナとして立ち上がってるからだっけ)

$ docker-compose run --rm firebase /bin/bash app# curl http://localhost:4000 curl: (7) Failed to connect to localhost port 4000: Connection refused

ポートフォワーディングの解決としてはコンテナ内は0.0.0.0で起動するようにします。

firebase/firebase.json

{ "emulators": { "auth": { "host": "0.0.0.0", "port": 9099 }, "ui": { "enabled": true, "host": "0.0.0.0", "port": 4000 }, "singleProjectMode": true, "functions": { "host": "0.0.0.0", "port": 5001 } } }

docker compose upしなおすとhttp://localhost:4000/authにアクセスできるようになりました。

yosi

Noh を作ってるエンジニア。

目次