LoginSignup
2
3

More than 5 years have passed since last update.

JSerがGolang始めてみた 〜 2. WebApp入門(ほぼDocker)

Last updated at Posted at 2017-12-28

前回はGolangの環境を構築して挨拶を済ませたところまでだったので、今回はWebAppを作ってみます。

Framework

GolangのWebフレームワークは色々あるみたいですが、今回は早い軽いと評判のginとやらを使ってみることにします。

パッケージマネージャ

Golangのパッケージマネージャも検索するといろいろヒットするので、とりあえず新しそうなdepを使ってみます。

Docker環境作る

せっかくなのでDockerで動かしてみようと思います。ローカルでgo get叩きたくないしね。
イメージはgolang:1.9.2-alpineを使います。

まずはDockerfileを作ります。alpineイメージにGitがなかったので合わせて入れてます。

Dockerfile
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も。

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で動かしてみます。

main.go
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を使うよう修正。

main.go
  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()
  }

そしてDockerfileginを使うように修正します。

Dockerfile
  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を作ってみます。

続く

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3