演示工程
package mainimport ("github.com/gin-gonic/gin""net/http")func main() {r := gin.Default()r.GET("/", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"code": 0,"message": "success","data": "hello world",})})r.GET("/hello", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"code": 0,"message": "success","data": "world",})})r.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"code": 0,"message": "success","data": "pong",})})r.Run(":8080")}
Dockerfile
GO111MODULE=off 需要执行
go mod vendor
FROM registry.cn-beijing.aliyuncs.com/baxiang/golang:1.14 as buildENV GO111MODULE=offENV GOBUILDPATH=github.com/baxiang/hello-worldRUN mkdir -p /go/src/${GOBUILDPATH}COPY ./ /go/src/${GOBUILDPATH}RUN cd /go/src/${GOBUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -vFROM alpine as debugWORKDIR /hello-wordldCOPY --from=build /go/bin/hello-world ./hello-worldEXPOSE 8080CMD ["./hello-world"]
或者设置成GO111MODULE=on
FROM registry.cn-beijing.aliyuncs.com/baxiang/golang:1.14 as buildENV GO111MODULE=onENV GOPROXY=https://mirrors.aliyun.com/goproxy/ENV GOBUILDPATH=github.com/baxiang/hello-worldRUN mkdir -p /go/src/${GOBUILDPATH}COPY ./ /go/src/${GOBUILDPATH}RUN cd /go/src/${GOBUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -vFROM alpine as devWORKDIR /hello-wordldCOPY --from=build /go/bin/hello-world ./hello-worldEXPOSE 8080CMD ["./hello-world"]
打包脚本采用Makefile
DOCKER_REGISTRY = registry.cn-beijing.aliyuncs.com/baxiangDOCKER_IMAGE = hello-worldDOCKER_FULL_NAME = $(DOCKER_REGISTRY)/$(DOCKER_IMAGE)DOCKER_TAG = v1.0.PHONY: dockerdocker:@docker build --target dev -t $(DOCKER_FULL_NAME):$(DOCKER_TAG) -f Dockerfile .@docker push $(DOCKER_FULL_NAME):$(DOCKER_TAG)
go项目基于alpine 构建docker镜像,启动容器的时候一直报错 standard_init_linux.go:211: exec user process caused “no such file or directory”
动态链接的在微型镜像alpine上不支持。默认go使用静态链接,在docker的golang环境中默认是使用动态编译。
如果想使用docker编译+alpine部署,可以通过禁用cgo set CGO_ENABLED=0来解决。
如果要使用cgo可以通过go build —ldflags “-extldflags -static” 来让gcc使用静态编译。
