GAE/GOなdockerを作ろうとしたら10時間溶けた
GAE/go開発環境ってgoのバージョンとpythonのバージョンとSDKのバージョン管理しないといけないので、まあまあややこしい。
そこで調子に乗って覚えたてのdockerでGAE/go用のdockerを作ろうと挑んだら、これがなかなか苦戦した。
dockerfile
golangとcloud-sdkの公式イメージをベースに作成。
golangはmulti-stage buildで取り込むだけ。
GAE GO SDKはcloud-sdkに吸収されて廃止方向?みたいなのだが、cloud-sdkのgcloudだとデプロイがどうしても上手くいかない(compiled failed)。
仕方なくGAE GO SDKをインストールするようにした。
FROM golang:1.8 AS golang FROM google/cloud-sdk:latest ARG sdk="1.9.64" # golang multi-stage build COPY --from=golang /usr/local/go /usr/local/go/ # GOPATH設定 RUN mkdir -p /go/src ENV GOPATH /go # go PATH設定 ENV PATH $PATH:/usr/local/go/bin:/go/bin # GAE GO SDKインストール RUN apt-get update RUN apt-get install unzip RUN curl -O https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-${sdk}.zip RUN unzip go_appengine_sdk_linux_amd64-${sdk}.zip -d /usr/local RUN rm go_appengine_sdk_linux_amd64-${sdk}.zip # go PATH設定 ENV PATH $PATH:/usr/local/go_appengine # ポート解放 EXPOSE 8000 EXPOSE 8080
SDK・golang・pythonはdockerコンテナにまかせて、ソースはホスト側でVSCodeでいじる構成。
(pythonはcloud-sdkが面倒見てくれてる。)
docker作成
イメージの作成と、コンテナの作成。
ソースはホストから、コンテナの/go/srcへマウントする方式にした。
# メージ作成 > docker build ./ -t gae # コンテナ作成 > docker run --name gae_sample -itd -p 8000:8000 -p 8080:8080 -v ${PWD}/:/go/src/sample gae
GAE
SSH接続してからの、GAE関連のコマンド紹介。
開発サーバ起動するときにはhostオプションを以下のようにつけないと、ホスト側からlocalhost:8080でアクセスできないので注意。
初回デプロイ時には認証を挟まないといけないので注意。(application_idは作成した自プロジェクトのもを使う)
# SSH接続 > docker exec -it gae_sample /bin/bash # 該当ソースまで移動 > cd /go/src/sample # 開発サーバ起動 > goapp serve --host=0.0.0.0 # 初回デプロイ > appcfg.py --noauth_local_webserver -A application_id -V v1 update ./ # 通常デプロイ > goapp deploy
Windowsファイルウォッチ
Windowsからdockerへソースを共有していると、開発サーバがソース修正したり変更しても検知してくれないので、開発サーバ再起動させないといけないので超不便。
そこでdocker-windows-volume-watcherなるpythonツールをインストールすると、開発サーバがちゃんと検知して再ビルドしてくれるようになった。
GitHub - merofeev/docker-windows-volume-watcher: A tool to notify Docker contianers about changes in mounts on Windows.
Windows側にpythonやpipはインストールされているものとする。
pipが最新のv10じゃないとダメって怒られたのでpipをアップデート。
# Windowsコマンドプロンプト > pip install --upgrade pip > pip install docker-windows-volume-watcher
こんな感じでgae_sampleコンテナでホストのsampleソースフォルダを監視させる。
# Windowsコマンドプロンプト > docker-volume-watcher gae_sample C:\work\go\src\sample
WSLのUbuntuにdocker clientをインストールしたり、Windows側のpython環境が壊れたりとなにかと遠回りしたけど、これでなんとか動いた。
これで、また一つ開発環境を開発マシンから切り離せられてスッキリ。