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

SDKgolangpythonは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環境が壊れたりとなにかと遠回りしたけど、これでなんとか動いた。
これで、また一つ開発環境を開発マシンから切り離せられてスッキリ。

プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化