JSer开始尝试Golang 〜 2. WebApp入门(几乎是Docker)

由于上次只是搭建了Golang的环境并完成了问候,所以这一次我要尝试制作一个Web应用程序。

框架

听说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。

你好,世界 (Nǐ ,

我将在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。

启用实时重新加载(※ 2018/01/04 追加)

我之前一直在使用上面提到的Dockerfile进行操作,但是每次都需要重新构建非常麻烦,所以我一直在试验和尝试实现实时重载。
然后我发现了这样的东西,所以决定试一试。
※ 这个gin好像和框架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

(・∀・)イイネ!! -> 好棒啊! a!)

接下来,我们将尝试使用Gin创建一个简单的Web应用程序。

继续下去。

广告
将在 10 秒后关闭
bannerAds