演示工程
package main
import (
"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 build
ENV GO111MODULE=off
ENV GOBUILDPATH=github.com/baxiang/hello-world
RUN mkdir -p /go/src/${GOBUILDPATH}
COPY ./ /go/src/${GOBUILDPATH}
RUN cd /go/src/${GOBUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -v
FROM alpine as debug
WORKDIR /hello-wordld
COPY --from=build /go/bin/hello-world ./hello-world
EXPOSE 8080
CMD ["./hello-world"]
或者设置成GO111MODULE=on
FROM registry.cn-beijing.aliyuncs.com/baxiang/golang:1.14 as build
ENV GO111MODULE=on
ENV GOPROXY=https://mirrors.aliyun.com/goproxy/
ENV GOBUILDPATH=github.com/baxiang/hello-world
RUN mkdir -p /go/src/${GOBUILDPATH}
COPY ./ /go/src/${GOBUILDPATH}
RUN cd /go/src/${GOBUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -v
FROM alpine as dev
WORKDIR /hello-wordld
COPY --from=build /go/bin/hello-world ./hello-world
EXPOSE 8080
CMD ["./hello-world"]
打包脚本采用Makefile
DOCKER_REGISTRY = registry.cn-beijing.aliyuncs.com/baxiang
DOCKER_IMAGE = hello-world
DOCKER_FULL_NAME = $(DOCKER_REGISTRY)/$(DOCKER_IMAGE)
DOCKER_TAG = v1.0
.PHONY: docker
docker:
@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使用静态编译。