线上Go项目的Docker镜像应该怎么构建

3次阅读

共计 1350 个字符,预计需要花费 4 分钟才能阅读完成。

上期的文章:Kubernetes 入门实际 – 部署运行 Go 我的项目公布后,有网友留言说我文章里演示的镜像是把我的项目文件和 Go 都打包到了镜像里,这样镜像的占用空间会比拟大。

Go开发的程序在编译成二进制文件后是能够在没有装置 Go 环境的零碎里执行的,如果只把编译完的二进制文件间接放到镜像里就能节俭很多镜像空间了。我给的回复是文章的侧重点是 Kubernetes 的实际所以镜像方面就没有占太多篇幅。

的确实在线上我的项目的利用镜像个别都不像之前文章里讲那样构建,因为生产我的项目各方面要求更严格些。镜像构建的过程个别都是先用 Docker 容器把我的项目编译成二进制文件,而后把编译好的文件拷贝到一个新的容器镜像里,新镜像里个别只蕴含 Linux 零碎运行须要的最根本的文件,不须要有 Go 环境,因而能缩小很多占用空间。整个这个过程都产生在镜像构建的过程中,这样就能保障多环境的一致性,下面这个构建 Docker 镜像的形式叫做多阶段构建(multi stage build)。

多阶段构建是 17.05 版本才有的性能,所以应用前要先确定下应用的 Docker Engine 的版本。

上面就来介绍一下怎么应用 Docker 的多阶段构建制作 Go 利用的镜像。

之前文章里镜像的 Dockerfile 长这样:

FROM golang:1.14-alpine
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN go build -o main . 
CMD ["/app/main"]

咱们应用用多阶段构建的形式构建镜像后,Dockerfile会变成相似上面这样:

FROM golang:alpine AS build

RUN mkdir /app
COPY . /app
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp

### 
FROM scratch as final
COPY --from=build /app/myapp .
CMD ["/myapp"]

Go我的项目利用的 Dockerfile 通常大略相似这样,然而每个我的项目的细节可能有所不同。FROM golang:alpine指定了开始阶段的根底映像(其中蕴含 Go 工具和库,用于构建程序),AS build是给这个阶段取名为build

golang:alpine指定了 Go 根底映像的 alpine 版本,alpine是专门为容器设计的小型 Linux 发行版。这个 Dockerfile 中应用了两次 FROM 指令,第二条 FROM scratch 行,它通知 Docker 从一个全新的,齐全空的容器镜像从新开始,而后将上个阶段编译好的程序复制到其中。这个才是咱们随后将用于运行的 Go 应用程序的容器镜像。

scratch镜像是 Docker 我的项目预约义的最小的镜像。Docker用于 Go 程序的多阶段构建很常见,应用 scratch 镜像能够节俭大量空间,因为咱们实际上不须要 Go 工具或其余任何货色来运行咱们的编译好的程序,这可能也是 Go 在容器时代的一个劣势吧。

应用 scratch 镜像制作的 Go 利用镜像在运行时会有一个不辨认时区的问题,这个也是咱们最近我的项目往 Kubernetes 上迁徙时遇到的第一个问题,不过还好通过 Google 和查看 Go 加载时区的源码找到了解决办法,具体怎么解决的下期的文章再通知大家。

正文完
 0