我们修改一下Dockerfile.build,在编译Go源文件时加上CGO_ENABLED=0:
- // github.com/bigwhite/experiments/multi_stage_image_build/heterogeneous/Dockerfile.build
- FROM golang:latest
- WORKDIR /go/src
- COPY httpserver.go .
- RUN CGO_ENABLED=0 go build -o myhttpserver ./httpserver.go
- # docker build -t myrepo/golang-static-builder:latest -f Dockerfile.build .
- Sending build context to Docker daemon 4.096kB
- Step 1/4 : FROM golang:latest
- ---> 1a34fad76b34
- Step 2/4 : WORKDIR /go/src
- ---> 593cd9692019
- Removing intermediate container ee005d487ad5
- Step 3/4 : COPY httpserver.go .
- ---> a095eb69e716
- Step 4/4 : RUN CGO_ENABLED=0 go build -o myhttpserver ./httpserver.go
- ---> Running in d9f3b3a6c36c
- ---> c06fe8dccbad
- Removing intermediate container d9f3b3a6c36c
- Successfully built c06fe8dccbad
- Successfully tagged myrepo/golang-static-builder:latest
- # docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- myrepo/golang-static-builder latest c06fe8dccbad 31 seconds ago 739MB
接下来,我们再基于golang-static-builder中已经build完毕的静态连接的myhttpserver来构建我们最终的应用image:
- # docker create --name appsource myrepo/golang-static-builder:latest
- # docker cp appsource:/go/src/myhttpserver ./
- # ldd myhttpserver
- not a dynamic executable
- # docker rm -f appsource
- # docker rmi myrepo/golang-static-builder:latest
- # docker build -t myrepo/myhttpserver-alpine:latest -f Dockerfile.alpine .
运行新image:
Note: 我们可以用strace来证实静态连接时Go只应用的是Go本身的runtime实现,而并未应用到libc.a中的代码:
- # docker run myrepo/myhttpserver-alpine:latest
- Webserver start
- -> listen on port:1111
推荐阅读
Mobile Pwn2Own世界黑客大赛攻破iOS11,iPhone X被远程越狱
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 信赖会有越来越多的年青人参加到收集安然行业中来,以“没有收集安然就没有国度安然”为指导,>>>详细阅读
本文标题:理解Docker的多阶段镜像构建
地址:http://www.17bianji.com/lsqh/38807.html
1/2 1