Build.sh
- #!/bin/sh
- docker build -t –rm hello:build . -f Dockerfile.build
- docker create –name extract hello:build
- docker cp extract:/go/bin/hello ./hello
- docker rm -f extract
- docker build –no-cache -t –rm hello:run . -f Dockerfile.run
- rm -rf ./hello
执行build.sh完成项目的构建。
从上表可以看到,多文件构建大大减小了镜像的占用空间,但它有三个文件需要管理,维护成本也更高一些。
3. 多阶构建
最后我们来看看万众期待的多阶构建。
完成多阶段构建我们只需要在Dockerfile中多次使用FORM声明,每次FROM指令可以使用不同的基础镜像,并且每次FROM指令都会开始新的构建,我们可以选择将一个阶段的构建结果复制到另一个阶段,在最终的镜像中只会留下最后一次构建的结果,这样就可以很容易地解决前面提到的问题,并且只需要编写一个Dockerfile文件。这里值得注意的是:需要确保Docker的版本在17.05及以上。下面我们来说说具体操作。
在Dockerfile里可以使用as来为某一阶段取一个别名”build-env”:
- FROM golang:1.11.2-alpine3.8 AS build-env
- COPY –from=build-env /go/bin/hello /usr/bin/hello
看一个简单的例子:
- FROM golang:1.11.4-alpine3.8 AS build-env
-
- ENV GO111MODULE=off
- ENV GO15VENDOREXPERIMENT=1
- ENV GITPATH=github.com/lattecake/hello
- RUN mkdir -p /go/src/${GITPATH}
- COPY ./ /go/src/${GITPATH}
- RUN cd /go/src/${GITPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -v
-
- FROM alpine:latest
- ENV apk –no-cache add ca-certificates
- COPY --from=build-env /go/bin/hello /root/hello
- WORKDIR /root
- CMD ["/root/hello"]
执行docker build -t –rm hello3 .后再执行docker images ,然后我们来看镜像的大小:
多阶构建给我们带来很多便利,最大的优势是在保证运行镜像足够小的情况下还减轻了Dockerfile的维护负担,因此我们极力推荐使用多阶构建来将你的代码打包成Docker 镜像。
【本文是51CTO专栏机构宜信技术学院的原创文章,微信公众号“宜信技术学院( id: CE_TECH)”】
戳这里,看该作者更多好文
【编辑推荐】
- 为什么国内程序员996.ICU,而美国程序员却可以轻松"养老"?
- 容器赋能AI-人工智能在360私有云容器服务上的实践
- 程序员的宿命是怎样的
- 谷歌程序员有哪些高效的编程习惯?
- 刚刚,又有一位程序员倒下了......
【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0 (编辑:西安站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|