本文介绍如何在本地制作Docker镜像,并以镜像方式将Go应用部署到Serverless应用引擎SAE(Serverless App Engine)。

前提条件

# Golang版本;Alpine镜像的体积较小。
FROM golang:1.16.6-alpine3.14 as builder

# 替换Alpine镜像,方便安装构建包。
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# 安装构建阶段的依赖。
RUN apk --update add gcc libc-dev upx ca-certificates && update-ca-certificates

# 将代码复制到构建镜像中。
# 注意地址不要在GOPATH中。
ADD . /workspace

WORKDIR /workspace

# 挂载构建缓存。
# GOPROXY防止下载失败。
RUN --mount=type=cache,target=/go \
  env GOPROXY=https://goproxy.cn,direct \
  go build -buildmode=pie -ldflags "-linkmode external -extldflags -static -w" \
  -o /workspace/gin-hello-world

# 运行时镜像。
# Alpine兼顾了镜像大小和运维性。
FROM alpine:3.14

EXPOSE 8080

# 方便运维人员安装需要的包。
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# 创建日志目录等。
# RUN mkdir /var/log/onepilot -p && chmod 777 /var/log/onepilot && touch /var/log/onepilot/.keep

# 复制构建产物。
COPY --from=builder /workspace/gin-hello-world /app/

# 指定默认的启动命令。
CMD ["/app/gin-hello-world"]
docker build . -t gin-example
docker run -p 127.0.0.1:8080:8080/tcp gin-example
curl http://127.0.0.1:8080/
docker build --tag go-demo:v1 .
docker login --username=<镜像仓库登录名> registry.<regionId>.aliyuncs.com
docker login --username=****@188077086902**** registry.cn-hangzhou.aliyuncs.com
docker tag <ImageId> registry.<regionId>.aliyuncs.com/****/go-demo:<镜像版本号>
docker tag go-demo:v1 registry.cn-hangzhou.aliyuncs.com/****/go-demo:v1
docker push registry.<regionId>.aliyuncs.com/****/go-demo:<镜像版本号>
docker push registry.cn-hangzhou.aliyuncs.com/****/go-demo:v1

步骤三:部署镜像

更多信息

如果您不想每次都通过手动方式构建、推送镜像,并部署应用,可以对接开源的Jenkins或者阿里云云效。具体信息,请参见以下文档: