演示工程

  1. package main
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. )
  6. func main() {
  7. r := gin.Default()
  8. r.GET("/", func(c *gin.Context) {
  9. c.JSON(http.StatusOK, gin.H{
  10. "code": 0,
  11. "message": "success",
  12. "data": "hello world",
  13. })
  14. })
  15. r.GET("/hello", func(c *gin.Context) {
  16. c.JSON(http.StatusOK, gin.H{
  17. "code": 0,
  18. "message": "success",
  19. "data": "world",
  20. })
  21. })
  22. r.GET("/ping", func(c *gin.Context) {
  23. c.JSON(http.StatusOK, gin.H{
  24. "code": 0,
  25. "message": "success",
  26. "data": "pong",
  27. })
  28. })
  29. r.Run(":8080")
  30. }

Dockerfile

GO111MODULE=off 需要执行

  1. go mod vendor
  1. FROM registry.cn-beijing.aliyuncs.com/baxiang/golang:1.14 as build
  2. ENV GO111MODULE=off
  3. ENV GOBUILDPATH=github.com/baxiang/hello-world
  4. RUN mkdir -p /go/src/${GOBUILDPATH}
  5. COPY ./ /go/src/${GOBUILDPATH}
  6. RUN cd /go/src/${GOBUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -v
  7. FROM alpine as debug
  8. WORKDIR /hello-wordld
  9. COPY --from=build /go/bin/hello-world ./hello-world
  10. EXPOSE 8080
  11. CMD ["./hello-world"]

或者设置成GO111MODULE=on

  1. FROM registry.cn-beijing.aliyuncs.com/baxiang/golang:1.14 as build
  2. ENV GO111MODULE=on
  3. ENV GOPROXY=https://mirrors.aliyun.com/goproxy/
  4. ENV GOBUILDPATH=github.com/baxiang/hello-world
  5. RUN mkdir -p /go/src/${GOBUILDPATH}
  6. COPY ./ /go/src/${GOBUILDPATH}
  7. RUN cd /go/src/${GOBUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -v
  8. FROM alpine as dev
  9. WORKDIR /hello-wordld
  10. COPY --from=build /go/bin/hello-world ./hello-world
  11. EXPOSE 8080
  12. CMD ["./hello-world"]

打包脚本采用Makefile

  1. DOCKER_REGISTRY = registry.cn-beijing.aliyuncs.com/baxiang
  2. DOCKER_IMAGE = hello-world
  3. DOCKER_FULL_NAME = $(DOCKER_REGISTRY)/$(DOCKER_IMAGE)
  4. DOCKER_TAG = v1.0
  5. .PHONY: docker
  6. docker:
  7. @docker build --target dev -t $(DOCKER_FULL_NAME):$(DOCKER_TAG) -f Dockerfile .
  8. @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使用静态编译。