DockerでGAE/Goの開発環境をつくる

## はじめに

### `docker version`
```:ターミナル
$ docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false
```

開発環境を構築することが目的なので、それに付随する説明等は省いております。

## 作業開始

### ① 任意の作業ディレクトリにフォルダを作成して移動

```:ターミナル
mkdir xxxxxxxxx

cd xxxxxxxxx
```

### ② Dockerfileを作成

※ 最後の行の `WORKDIR /go/src/xxxxxxxxx`   
`xxxxxxxxx` は最初に作成したフォルダ名

```:Dockerfile
FROM golang:1.11-stretch

ENV GOPATH=/go \
	PATH=/go/bin:/usr/local/go/bin:/google-cloud-sdk/bin:/google-cloud-sdk/platform/google_appengine:$PATH

ENV CLOUD_SDK_VERSION 241.0.0

RUN apt-get -qqy update && apt-get install -qqy \
        curl \
        gcc \
        python-dev \
        python-setuptools \
        apt-transport-https \
        lsb-release \
        openssh-client \
        git \
    && easy_install -U pip && \
    pip install -U crcmod   && \
    export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)" && \
    echo "deb https://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" > /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
    apt-get update && \
    apt-get install -y google-cloud-sdk=${CLOUD_SDK_VERSION}-0 \
        google-cloud-sdk-app-engine-python \
        google-cloud-sdk-app-engine-java \
        google-cloud-sdk-app-engine-go \
        google-cloud-sdk-datalab \
        google-cloud-sdk-datastore-emulator \
        google-cloud-sdk-pubsub-emulator \
        google-cloud-sdk-bigtable-emulator \
        google-cloud-sdk-cbt \
        kubectl && \
    gcloud config set core/disable_usage_reporting true && \
    gcloud config set component_manager/disable_update_check true && \
    gcloud config set metrics/environment github_docker_image
VOLUME ["/root/.config"]

WORKDIR /go/src/xxxxxxxxx
```

### ③ docker-compose.ymlを作成

※ `container_name: xxxxxxxxx` と `./:/go/src/xxxxxxxxx`   
`xxxxxxxxx` は最初に作成したフォルダ名

```:docker-compose.yml
version: '3'
services:
  app:
    build: .
    container_name: xxxxxxxxx
    volumes:
      - ./:/go/src/xxxxxxxxx
    ports:
      - "8080:8080"
    environment:
      GO111MODULE: "on"
```

### ④ `backend/main`フォルダを作成


### ⑤ `backend/main`に`main.go`を作成

```go:main.go
package main

import (
	"fmt"
)

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, World")
}
```

### ⑥ `backend/main` に `app.yaml` を作成

```:app.yaml
runtime: go111
```

### ⑦ コンテナを作成してコンテナ内に入る

```:ターミナル
docker-compose build

docker-compose run -p 8080:8080 app bash
```

### ⑧ コンテナ内で各コマンドの確認

```:コンテナ内bash
go version

gcloud version
```

### ⑨ goモジュール初期化

```:コンテナ内bash
go mod init
```

※ `go.mod` `go.sum` が生成される


### ⑩ goファイルのディレクトリに移動

```:コンテナ内bash
cd backend/main/
```

### ⑪ go localサーバー起動

```:コンテナ内bash
go run main.go
```

### ⑫ Google Chromeで `localhost:8080`

ブラウザにHellow, Worldが表示される

### ⑬ gcloudログイン

```:コンテナ内bash
gcloud auth login
※URLがでてくるので、ブラウザに貼り付けて認証
コードがでてくるのでbashに貼り付けて認証完了
```

### ⑭ GCPプロジェクトのセット

```:コンテナ内bash
gcloud config set project (projectId)
```

### ⑮ AppEngineにデプロイ

```:コンテナ内bash
gcloud app deploy
```

### ⑯ コンテナから出る

```:コンテナ内bash
exit
```

### ⑰ 既存のコンテナ名を確認してコンテナ内に再び入る

```:ターミナル
docker ps -a
※ NAMESの列がコンテナ名

docker start (コンテナ名)

docker exec -it (コンテナ名) bash
```

## 終わり

### 参考にした記事
https://github.com/gcpug/docker-appengine-go