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
- ubuntu 24.04
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
セキュリティの問題はありますが、利便性を優先して StrictHostKeyChecking と UserKnownHostsFile を設定しました
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 にそのままもっていくことはできなくなります
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段階にしてみました
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 ${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 がうまくうごかなくって、あきらめてこのパターンにしました。
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