FirebaseをDocker Composeで動かすメモ
投稿日: 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
にアクセスできるようになりました。
Noh を作ってるエンジニア。