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应用程序。
继续下去。