上期的文章: Kubernetes入门实践--部署运行 Go 项目 发布后,有网友留言说我文章里演示的镜像是把项目文件和Go都打包到了镜像里,这样镜像的占用空间会比较大。
Go
开发的程序在编译成二进制文件后是可以在没有安装 Go
环境的系统里执行的,如果只把编译完的二进制文件直接放到镜像里就能节省很多镜像空间了。我给的回复是文章的侧重点是 Kubernetes
的实践所以镜像方面就没有占太多篇幅。
确实线上项目的应用镜像一般都不像之前文章里讲的那样构建,因为生产项目各方面要求更严格些。镜像构建的过程一般都是先用 Docker
容器把项目编译成二进制文件,然后把编译好的文件拷贝到一个新的容器镜像里,新镜像里一般只包含 Linux
系统运行需要的最基本的文件,不需要有 Go
环境,因此能减少很多占用空间。整个这个过程都发生在镜像构建的过程中,这样就能保证多环境的一致性,上面这个构建 Docker
镜像的方式叫做多阶段构建( multi stage build
)。
多阶段构建是 17.05
版本才有的功能,所以使用前要先确定下使用的 Docker Engine
的版本。
下面就来介绍一下怎么使用 Docker
的多阶段构建制作 Go
应用的镜像。
之前文章 Kubernetes入门实践--部署运行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
项目预定义的最小的镜像。使用 scratch
镜像可以节省大量空间,因为我们实际上不需要 Go
工具或其他任何东西来运行我们的编译好的程序,这可能也是 Go
在容器时代的一个优势吧。
使用 scratch
镜像制作的 Go
应用镜像在运行时会有一个不识别时区的问题。这个也是我们最近项目往 Kubernetes
上迁移时遇到的第一个问题,不过还好经过 Google
和查看 Go
加载系统时区的源码我帮新来的运维小哥哥找到了解决方法,具体怎么解决的下期的文章再告诉大家。
:heart:爱心三连
1.看到这里了就点个在看支持下吧,你的 「 在看 」 是我创作的动力。
2.关注公众号 网管叨bi叨
, 「每周为您分享原创技术文章」
!
3.特殊阶段,带好口罩,做好个人防护。
“在看转发” 是最大的支持
以上所述就是小编给大家介绍的《线上 Go 项目的 Docker 镜像应该怎么构建?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 不要轻易使用 Alpine 镜像来构建 Docker 镜像,有坑!
- 根据Dockerfile构建镜像
- 构建go应用镜像
- 使用Dockerfile构建镜像
- Docker 构建镜像
- 利用Makisu构建容器镜像
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。