作家
登录

理解Docker的多阶段镜像构建

作者: 来源: 2017-11-14 09:05:22 阅读 我要评论

  1. # 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模板:

  1. REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE 
  2. golang                       alpine              9e3f14138abd        7 days ago          269MB 

alpine版golang builder的Dockerfile内容如下:

  1. //github.com/bigwhite/experiments/multi_stage_image_build/heterogeneous/Dockerfile.alpine.build 
  2.  
  3. FROM golang:alpine 
  4.  
  5. WORKDIR /go/src 
  6. COPY httpserver.go . 
  7.  
  8. 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)。

  1. //github.com/bigwhite/experiments/multi_stage_image_build/multi_stages/Dockerfile  
  2. FROM golang:alpine as builder  
  3. WORKDIR /go/src 
  4. COPY httpserver.go .  
  5. RUN go build -o myhttpserver ./httpserver.go  
  6. From alpine:latest  
  7. WORKDIR /root/ 
  8. COPY --from=builder /go/src/myhttpserver . 
  9. RUN chmod +x /root/myhttpserver  
  10. ENTRYPOINT ["/root/myhttpserver"
  1. # docker run myrepo/myhttserver-multi-stage:latest 
  2. Webserver start 
  3.   -> 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

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)