- # CGO_ENABLED=0 strace -f go build httpserver.go 2>&1 | grep open | grep -o '/.*\.a' > go-static-build-strace-file-open.txt
打开 go-static-build-strace-file-open.txt 文件查看文件内容,你不会找到libc.a这个文件(在Ubuntu下,一般libc.a躺在/usr/lib/x86_64-linux-gnu/下面),这解释go build根本没有测验测验去open libc.a文件并获取个中的符号角说。
2、应用alpine golang builder
我们的Go应用运行在alpine based的container中,我们可以应用alpine golang builder来构建我们的应用(无需静态链接)。前面提到过golang有alpine模板:
- REPOSITORY TAG IMAGE ID CREATED SIZE
- golang alpine 9e3f14138abd 7 days ago 269MB
alpine版golang builder的Dockerfile内容如下:
- //github.com/bigwhite/experiments/multi_stage_image_build/heterogeneous/Dockerfile.alpine.build
- FROM golang:alpine
- WORKDIR /go/src
- COPY httpserver.go .
- RUN go build -o myhttpserver ./httpserver.go
后续的操作与前面golang builder的操作并不二致:应用alpine golang builder构建我们的应用,并将其打入alpine image,这里就不赘述了。
三、多阶段镜像构建:晋升开辟者体验
在Docker 17.05以前,我们都是像膳绫擎那样构建镜像的。你会发明即便采取异构image builder模式,我们也要保护两个Dockerfile,并且还要在docker build敕令之外履行一些诸如安闲器内copy应用法度榜样、清理build container和build image等的操作。Docker社区看到了这个问题,于是实现了 多阶段镜像构建机制 (multi-stage)。
- //github.com/bigwhite/experiments/multi_stage_image_build/multi_stages/Dockerfile
- FROM golang:alpine as builder
- WORKDIR /go/src
- COPY httpserver.go .
- RUN go build -o myhttpserver ./httpserver.go
- From alpine:latest
- WORKDIR /root/
- COPY --from=builder /go/src/myhttpserver .
- RUN chmod +x /root/myhttpserver
- ENTRYPOINT ["/root/myhttpserver"]
- # docker run myrepo/myhttserver-multi-stage:latest
- Webserver start
- -> listen on port:1111
看完这个Dockerfile的内容,你的第一赶脚是不是把之前的两个Dockerfile归并在一可儿了,每个Dockerfile零丁作为一个“阶段”!事实也是如许,但这个Docker也多了一些新的语法情势,用于建立各个“阶段”之间的接洽。针对如许一个Dockerfile,我们应当知道以下几点:
- 支撑Multi-stage build的Dockerfile在以往的多个build阶段之间建立内涵连接,让后一个阶段构建可以应用前一个阶段构建的产品,形成一条构建阶段的chain;
- Multi-stages build的最终结不雅仅产生一个image,避免产生冗余的多个临时images或临时容器对象,这恰是我们所须要的:我们只要结不雅。
推荐阅读
Mobile Pwn2Own世界黑客大赛攻破iOS11,iPhone X被远程越狱
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 信赖会有越来越多的年青人参加到收集安然行业中来,以“没有收集安然就没有国度安然”为指导,>>>详细阅读
本文标题:理解Docker的多阶段镜像构建
地址:http://www.17bianji.com/lsqh/38807.html
1/2 1