🐈

go+firestoreを自宅dockerで

に公開

はじめに

go開発環境とfirebaseのデバッグ環境をコンテナで作成

windows PC 2台を使って開発をします
ひとつはいろいろ普段使いするので汚したくないので vscode だけいれます
もう1台もすぐ初期化できるように でdocker を動かして、その中で開発環境をつくります

はじめは、GCP に GCE で環境作ってって思ってたのですが、PC一台あるしローカルでやってみますかって感じです

うまくいけば、まるごと GCE でも同じように作業できるかなって思い、
今時の conteiner deverop ??? みたいなのより、だいぶ階層が深いって感じがしますが、
まぁとりあえず動いたので、残しておきます

最近同じような内容を連投していますが、ここに至る紆余曲折ということで、
記事をさかのぼってみていただくと、いろんなパターンがあるんかって思ってもらえるかもしれません

あとになるほど良くなっているとは限らないところが見どころになるかもw

環境

i5-14400

  • windows11 pro
  • 192.168.1.13
  • powershell 7
  • wsl2
    • ubuntu 24.04
      • 192.168.1.18 (bridged)
      • .ssh/authorized_keys
      • .ssh/config,id_ed25519id_ed25519.pub
      • sshd (apt)
      • docker (snap)
      • vscode-server? (自動的に入る)
        • container-tools

i5-10400

  • windows11 home
  • 192.168.1.14
  • powershell 7
  • .ssh/config,id_ed25519id_ed25519.pub
  • vscode
    • remote-ssh (自動であと2つ入った)
  • wsl2 (いらんかったっぽい)
    • ubuntu 24.04

コンテナ

go

  • ベースは debian の公式イメージ
  • go の公式イメージから必要なファイルだけをコピー
  • .ssh は wsl2 のディレクトリをマウント

fire

  • デフォルトの google のプロジェクトは .firebaserc に設定
  • .firebaserc 以外だと auth がうまくいかないっぽい
  • 192.168.1.18:4000 (コンテナが動いている PC) で UI が動いた

操作

i5-14400

  • pro へは home からリモートデスクトップではいる
  • wsl のターミナルを起動しておく

i5-10400

  • vscodeだけで作業する

  • remote-ssh で i5-14400 の ubuntu につなぐ

  • container tools 拡張機能をいれる

  • con05(このリポジトリ)を clone してコンテナを起動する

  • vscode を con05 で作成された go のコンテナにつなぐ

  • go 拡張機能をいれる

  • dlv をいれる

  • go07 などの go プログラムのリポジトリを clone する

  • vscode でデバッグ実行する

  • ブラウザで 192.168.1.18:4000(i5-14400 の wsl)に接続

ソース

config

セキュリティの問題はありますが、利便性を優先して StrictHostKeyCheckingUserKnownHostsFile を設定しました

Host i5-14400(wsl2)
    HostName 192.168.1.18
    User yukip
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
Host con05
    HostName 192.168.1.18
    User yukip
    Port 2205
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

.env

無理に変数にしすぎたかも

PROJECT="apis-open-chottodake-dev"

CON="05"

GO_NAME="con${CON}go"
SSHPORT="22${CON}"

FIRE_NAME="con${CON}fire"

compose.yaml

やはり マウントすると楽ですが、GCE にそのままもっていくことはできなくなります

compose.yaml
services:
  go:
    image: ${GO_NAME}
    build:
      context: ./go
      dockerfile: Dockerfile
      args:
        PROJECT: "${PROJECT}"
        FIREBASE: "${FIRE_NAME}"
    container_name: ${GO_NAME}
    hostname: ${GO_NAME}
    ports:
      - "${SSHPORT}:22"
    volumes:
      - /home/yukip/.ssh:/home/yukip/.ssh:ro
    extra_hosts:
      - "host.docker.internal:host-gateway"
    # command: tail -f /dev/null

  fire:
    image: ${FIRE_NAME}
    build:
      context: ./fire
      dockerfile: Dockerfile
      args:
        PROJECT: "${PROJECT}"
    container_name: ${FIRE_NAME}
    hostname: ${FIRE_NAME}
    ports:
      - "4000:4000"
      - "8080:8080"
      - "9099:9099"
    # command: tail -f /dev/null

dockerfile (go lang)

golang:1.24-bookworm そのまま使ってもいいのですが、微妙に違いがあったので2段階にしてみました

Dockerfile
ARG GOROOT="/usr/local/go"

FROM golang:1.24-bookworm
ARG GOROOT

RUN if [ "${GOROOT}" != "$(go env GOROOT)" ]; then exit 1; fi;

FROM debian:bookworm-slim
ARG GOROOT

ARG PROJECT
ARG FIREBASE

EXPOSE 22

COPY --from=0 ${GOROOT} ${GOROOT}

RUN apt-get update \
&&  apt-get install -y --no-install-recommends \
    ca-certificates \
    sudo \
    openssh-server \
    git \
    vim \
&&  apt-get clean \
&&  rm -rf /var/lib/apt/lists/*

RUN mkdir -p /run/sshd \
&&  echo "PubkeyAuthentication yes" > /etc/ssh/sshd_config.d/99-custom.conf

RUN useradd -m -s /bin/bash yukip \
&&  usermod -aG sudo yukip \
&&  echo "yukip ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

USER yukip

RUN git config --global user.name "yukip" \
&&  git config --global user.email "yukip@chottodake.dev"

RUN echo "source ~/yukip.bashrc" >> ~/.bashrc \
&&  cat <<END | sed 's/^ \{4\}//' > ~/yukip.bashrc
    #env
    export TZ=Asia/Tokyo
    export GOOGLE_CLOUD_PROJECT="${PROJECT}"
    export FIRESTORE_EMULATOR_HOST="${FIREBASE}:8080"
    export PATH="${GOROOT}/bin:${PATH}"

    #history
    shopt -s histverify
    alias hist='history  | grep -v "hist " | grep --color=never'

    #etc
    alias ls='ls --color=always'

    #git
    alias gitlog='git fetch;git log --oneline --graph --all origin/main'
    alias gitcommit='git add .;git commit -m '
    alias gitpush='git push;git push --tags'
    alias gitdiff='git fetch;git diff --name-status main origin/main'

    # prompt
    PS1='\n\[\e[1;34m\]\h [$(date +%Y/%m/%d) \t \w]\n\$\[\e[0m\] '
END

USER root

ENTRYPOINT ["bash", "-c"]
CMD ["/usr/sbin/sshd -D -e"]

dockerfile ( firebase )

デフォルトのプロジェクトの指定場所が結構微妙で、ここにおちつきました
java をベースにするか、nodejs をベースにするか微妙ですが、こっちの方が少しシンプルになったようなきがします
google 提供の gcloud-sdk でもいいのかと思ったのですが、 firebase took の UI がうまくうごかなくって、あきらめてこのパターンにしました。

Dockerfile
FROM openjdk:26-jdk-bookworm

ARG PROJECT

EXPOSE 4000 8080 9099

RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash -

RUN apt-get update \
&&  apt-get install -y --no-install-recommends \
    nodejs \
&&  apt-get clean \
&&  rm -rf /var/lib/apt/lists/*

RUN cat <<END > .firebaserc
{
  "projects": {
    "default": "${PROJECT}"
  }
}
END

RUN cat <<END > firebase.json
{
  "emulators": {
    "ui":        {"host": "0.0.0.0", "port": 4000, "enabled": true},
    "firestore": {"host": "0.0.0.0", "port": 8080  },
    "auth":      {"host": "0.0.0.0", "port": 9099  },
    "singleProjectMode": false
  }
}
END

RUN npm install -g firebase-tools

ENTRYPOINT ["bash", "-c"]
CMD ["firebase emulators:start"]

おわり

  • firestore は動いてるけど、auth はまだやったことがない
  • PC 2台使わなくても ... って感じしますw i5-10400 をなくして普段使いに i5-14400 ということになる日もくるかもしれませんが、 M2bookAir もあるので、 そこに vscode いれたら同じように動くので、これはこれでありかもって、自分を許してあげています。

Discussion