博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dockerfile多阶段构建
阅读量:7227 次
发布时间:2019-06-29

本文共 1745 字,大约阅读时间需要 5 分钟。

hot3.png

要求

从Docker 17.05版本开始,使用docker build命令开始支持多阶段构建。

之前解决方案

比如我想把自己开发的一个app.go,我想在自己最终的容器中使用编译过的app可执行文件,但是我有不想在最终的容器中保存一些不需要的东西,这时我需要:

  1. 构建一个中间辅助容器,然后在里面将我开发的app.go编译好,然后从容器中拷贝到本地目录,然后将中间服务容器删除掉
  2. 重新构建一个容器,将之前编译好,并且在本地目录的可执行文件拷贝到新容器中,那么我最终的容器就没有一些不需要的东西了,保证了容器尽量小

中间辅助容器的Dockerfile.build内容如下

FROM golang:1.7.3WORKDIR /go/src/github.com/alexellis/href-counter/COPY app.go .RUN go get -d -v golang.org/x/net/html \  && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

最终容器的Dockerfile内容如下

FROM alpine:latest  RUN apk --no-cache add ca-certificatesWORKDIR /root/COPY app .CMD ["./app"]

中间构建容器,拷贝文件的操作放到一个脚本中,内容如下

#!/bin/shecho Building alexellis2/href-counter:builddocker build --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy \      -t alexellis2/href-counter:build . -f Dockerfile.builddocker container create --name extract alexellis2/href-counter:build  docker container cp extract:/go/src/github.com/alexellis/href-counter/app ./app  docker container rm -f extractecho Building alexellis2/href-counter:latestdocker build --no-cache -t alexellis2/href-counter:latest .rm ./app

Dockerfile多阶段构建

多阶段构建的Dockerfile中可以有多个FROM指令,每个FROM指令中可以使用不同的基础镜像。每一个FROM代表一个构建阶段。可以在不同的阶段之间进行文件的拷贝,从而保证只将自己需要的文件拷贝到最终的镜像中,实现镜像尽量小的要求。

支持多阶段构建的Dockerfile内容如下

FROM golang:1.7.3 as builderWORKDIR /go/src/github.com/alexellis/href-counter/RUN go get -d -v golang.org/x/net/htmlCOPY app.go .RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .FROM alpine:latestRUN apk --no-cache add ca-certificatesWORKDIR /root/COPY --from=builder /go/src/github.com/alexellis/href-counter/app .CMD ["./app"]

构建最终镜像只需要执行一条docker build -t alexellis2/href-counter:latest .命令就可以了,不再需要中间辅助脚本

参考文献

转载于:https://my.oschina.net/alazyer/blog/1828993

你可能感兴趣的文章
移动互联网下半场,iOS开发者如何“高薪”成长?
查看>>
Atlassian是怎样进行持续交付的?且听 Steve Smith一一道来
查看>>
Web Storage相关
查看>>
[PHP内核探索]PHP中的哈希表
查看>>
Apache-drill Architechture
查看>>
WordPress 5.2 Beta 3 发布,要求 PHP 5.6.20 以上版本
查看>>
通通连起来——无处不在的流
查看>>
互联网+时代,看云计算如何改变传统行业
查看>>
ZFS ARC & L2ARC zfs-$ver/module/zfs/arc.c
查看>>
c++类默认拷贝构造函数---浅复制
查看>>
2019年最火热的Golang项目
查看>>
可实现RSSD云硬盘120万IOPS的SPDK IO路径优化实践
查看>>
Vue项目部署遇到的坑(你肯定会遇到!)
查看>>
资源分享计划第三期 0511
查看>>
awk 文本处理
查看>>
【JSConf EU 2018】主题总结 (部分主题已有中文文章)
查看>>
JavaScript面向对象名词详解
查看>>
Java设计模式学习 - 责任链模式
查看>>
JVM,DVM,ART
查看>>
webgl滤镜--会呼吸的痛
查看>>