加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

程序员如何编写优雅的Dockerfile

发布时间:2019-04-21 05:45:00 所属栏目:教程 来源:王聪
导读:副标题#e# Kubernetes要从容器化开始,而容器又需要从Dockerfile开始,本文将介绍如何写出一个优雅的Dockerfile文件。 文章主要内容包括: Docker容器 Dockerfile 使用多阶构建 感谢公司提供大量机器资源及时间让我们可以实践,感谢在此专题上不断实践的部

从下表可以看出两个Dockerfile所编译出来的镜像大小:

  1. $ docker images | grep ubuntu       
  2. REPOSITORY      TAG     IMAGE ID    CREATED     SIZE                                                                                                                                    
  3. ubuntu                   16.04       9361ce633ff1  1 days ago 422MB 
  4. ubuntu                   16.04-1   3f5b979df1a9  1 days ago  412MB 

呃…. 好像并没有特别的效果,但若Dockerfile非常长的话可以考虑减少层次,因为Dockerfile最高只能有127层。

三、使用多阶构建

Docker在升级到Docker 17.05之后就能支持多阶构建了,为了使镜像更加小巧,我们采用多阶构建的方式来打包镜像。在多阶构建出现之前我们通常使用一个Dockerfile或多个Dockerfile来构建镜像。

1. 单文件构建

在多阶构建出来之前使用单个文件进行构建,单文件就是将所有的构建过程(包括项目的依赖、编译、测试、打包过程)全部包含在一个Dockerfile中之下:

  1. FROM golang:1.11.4-alpine3.8 AS build-env 
  2. ENV GO111MODULE=off 
  3. ENV GO15VENDOREXPERIMENT=1 
  4. ENV BUILDPATH=github.com/lattecake/hello 
  5. RUN mkdir -p /go/src/${BUILDPATH} 
  6. COPY ./ /go/src/${BUILDPATH} 
  7. RUN cd /go/src/${BUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install –v 
  8.  
  9. CMD [/go/bin/hello] 

这种的做法会带来一些问题:

  1. Dockerfile文件会特别长,当需要的东西越来越多的时候可维护性指数级将会下降;
  2. 镜像层次过多,镜像的体积会逐步增大,部署也会变得越来越慢;
  3. 代码存在泄漏风险。

以Golang为例,它运行时不依赖任何环境,只需要有一个编译环境,那这个编译环境在实际运行时是没有任务作用的,编译完成后,那些源码和编译器已经没有任务用处了也就没必要留在镜像里。

上表可以看到,单文件构建最终占用了312MB的空间。

2.  多文件构建

在多阶构建出来之前有没有好的解决方案呢?有,比如采用多文件构建或在构建服务器上安装编译器,不过在构建服务器上安装编译器这种方法我们就不推荐了,因为在构建服务器上安装编译器会导致构建服务器变得非常臃肿,需要适配各个语言多个版本、依赖,容易出错,维护成本高。所以我们只介绍多文件构建的方式。

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读