golang 与 docker 初体验
创建golang的docker镜像
学习docker 与 golang的相关知识,本处不赘述
编写一个golang的测试用例main.go,如下:
package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", hello) r.Run(":8080") } func hello(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }
在同级目录下创建对应Dockerfile
# 使用最新版 golang 作为基础镜像 FROM golang:latest AS builder #设置工作目录,没有则自动新建 WORKDIR /go/src/ #拷贝代码到当前 COPY main.go /go/src/ ## 编译 RUN go bulild main.go #运行服务 CMD ["./main"]
创建镜像docker build -t my-first .
不过会失败,因为 在 go build 的过程中,在本镜像中无法获取对应的 github.com/gin-gonic/gin 依赖
所以我们采取以下的方案
# 使用最新版 golang 作为基础镜像 FROM golang:latest AS builder #设置工作目录,没有则自动新建 WORKDIR /go/src/ #拷贝代码到当前 COPY main.go . # 获取依赖 RUN go get -d -v ./... RUN go install -v ./... ## 编译 RUN go bulild main.go #运行服务 CMD ["./main"]
不大大概率还是失败。。。因为有些东西会被墙住。。。
所以我们要采取粗暴的方式!将依赖直接打包进docker镜像中。
# 使用最新版 golang 作为基础镜像 FROM golang:latest AS builder #设置工作目录,没有则自动新建 WORKDIR /go/src/ #拷贝代码到当前 COPY main.go /go/src/ COPY vendor/ /go/src/ ## 编译 RUN go bulild main.go #运行服务 CMD ["./main"]
本Dockerfile中,有一个上文没提到过的vendor,其实该文件夹是存放的是当前服务的依赖。可以通过使用 go mod init,并且打开 Vendoring mode ,此时sync 你的模块时,会在当前目录下生成一个vendor文件夹
当然上述的打包出来的docker 镜像太过于巨大了,可以减小镜像体积,最终,生成的Dockerfile 如下:
# 使用最新版 golang 作为基础镜像 FROM golang:latest AS builder #设置工作目录,没有则自动新建 WORKDIR /go/src/ #拷贝代码到当前 COPY main.go /go/src/ COPY vendor/ /go/src/ ## 编译 RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
本作品采用《CC 协议》,转载必须注明作者和本文链接