前回はGolangの環境を構築して挨拶を済ませたところまでだったので、今回はWebAppを作ってみます。
Framework
GolangのWebフレームワークは色々あるみたいですが、今回は早い軽いと評判のginとやらを使ってみることにします。
パッケージマネージャ
Golangのパッケージマネージャも検索するといろいろヒットするので、とりあえず新しそうなdepを使ってみます。
Docker環境作る
せっかくなのでDockerで動かしてみようと思います。ローカルでgo get叩きたくないしね。
イメージはgolang:1.9.2-alpineを使います。
まずはDockerfileを作ります。alpineイメージにGitがなかったので合わせて入れてます。
FROM golang:1.9.2-alpine
ENV GOBIN /go/bin
ADD . /go/src/app
WORKDIR /go/src/app
RUN apk add --no-cache git \
&& go get -u github.com/golang/dep/cmd/dep \
&& dep ensure
RUN go build -o /go/bin/myapp .
CMD ["/go/bin/myapp"]
ついでにdocker-compose.ymlも。
version: '2'
services:
app:
build:
context: ./
dockerfile: Dockerfile
volumes:
- '.:/go/src/app'
- '/go/src/app/vendor'
environment:
PORT: 9800
ports:
- '9800:9800'
Dockerfile内でdep ensure叩いてますが、このままだとGopkg.toml, Gopkg.lockが無いため失敗します。
dep initは初回以外では必要無いので、Dockerfileには含めたくないですが、ローカルで叩くのも嫌なのでDocker使って叩きます。
docker run -v $PWD:/go/src/app -it golang:1.9.2-alpine /bin/sh
# ここからdockerコンテナ内
$ apk add --no-cache git
$ go get -u github.com/golang/dep/cmd/dep
$ dep init
これでローカルにGopkg.toml, Gopkg.lockが生成され、Docker立ち上げる準備が出来ました。
Hello World
GinでHello Worldを書いてDockerで動かしてみます。
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/hello", func(ctx *gin.Context) {
ctx.JSON(200, gin.H{
"message": "Hello World",
})
})
r.Run()
}
あとはdocker-compose up -d --buildを叩けばDocker上でGinを動かすことが出来ます。
ブラウザからhttp://localhost:9800にアクセスして{"message":"Hello World"}と表示されればOKです。
Live Reloadを有効にする(※ 2018/01/04 追記)
しばらくは上述のDockerfileで運用してたんですが、いちいちリビルドしにいかないといけないのが非常に面倒だったので、Live Reload出来ないか試行錯誤してました。
そしたらこんなものを見つけたので使ってみることにします。
※ このginはFWのginとは別物らしいです。
まずはmain.goを環境変数のPORTを使うよう修正。
package main
import (
+ "os"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/hello", func(ctx *gin.Context) {
ctx.JSON(200, gin.H{
"message": "Hello World",
})
})
+ port := os.Getenv("PORT")
+ if len(port) == 0 {
+ port = "9800"
+ }
+ r.Run(":" + port)
- r.Run()
}
そしてDockerfileをginを使うように修正します。
FROM golang:1.9.2-alpine
ENV GOBIN /go/bin
ADD . /go/src/app
WORKDIR /go/src/app
RUN apk add --no-cache git \
&& go get -u github.com/golang/dep/cmd/dep \
+ && go get -u github.com/codegangsta/gin \
&& dep ensure
- RUN go build -o /go/bin/myapp .
- CMD ["/go/bin/myapp"]
+ CMD gin -p 9800
これでdocker-compose up -d --buildすれば、Live Reload対応の環境が出来ます。
試しにmain.goを適当に書き換えてみると、ginでリビルドが走るのが確認出来ます。
app_1 | 2018-01-04T11:35:44.985528373Z [gin] Building...
app_1 | 2018-01-04T11:35:50.423585321Z [gin] Build finished
(・∀・)イイネ!!
次はGinをつかった簡単なWebAppを作ってみます。
続く。