前回は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を作ってみます。
続く。