准备工作
- 安装docker,multi-stage功能的最低版本17.05。
- 了解创建一个基础镜像
介绍
multi-stage功能有什么功效?接下来将通过一个go程序例子进行讲解。开发go应用程序需要如下几个必备条件;
- 一台用于开发的机器(linux、window)
- go开发环境,设置goroot、gopath,gobin等环境变量
- 额外的lib库
- 运行binary环境
如果不使用multi-stage,为了尽量保证image比较小,可能会使用如下的方式构建docker image。
- 第一步,创建用于编译环境的
Dockerfile.build
|
|
- 第二步,创建用于运行环境的
Dockerfile
|
|
- 第三步,创建运行脚步
build.sh
|
|
以上的构建过程,运行build.sh
,会先构建编译环境用于构建可运行的应用程序,然后,将可执行应用程序app拷贝到local,用于构建最终的运行环境,最后,清理local的app临时文件。
整个构建过程,需要编写额外的build.sh
脚步,执行冗长的命令,最后还需要做一些清理工作。不管是用于编译的image还是用于运行的image都会占用本地的磁盘空间。
那么,有没有更好的方式?答案就是multi-stage
。
使用multi-stage构建
编写dockerfile
|
|
在dockerfile
中,使用两次FROM
命令,每一个FROM
可以使用不同的基础image
,它们处于不同的构建阶段。可以从一个stage
拷贝文件到另外一个stage
,使用COPY
命令,--from
指定从哪个stage拷贝,不需要的文件可以完全忽略。
构建命令如下,
|
|
给stage命名
默认情况下,每一个stage是没有命名的,只能通过序号进行引用,第一个FROM
的序号是0,后面的依次类推。也可以通过给stage命名,更方便的引用各个stage,并增加可维护性,避免重新排列FROM
命令造成混乱。接下来通过修改上面的例子展示了stage命名的用法;
|
|
总结
multi-stage模式有效的减少了image的大小,增加了dockerfile,部署的简洁性和可维护性。