[13th][Day22] multistage

昨天建立 demo 这个 静态执行档是使用 gcc 这个 build container,然後在 scratch 内直接 ADD 执行档

从 code 编译成为 执行档的过程中常需要常会用到许多其他额外的工具
接着 编译完成的执行档也可能会需要适当的环境或是其他背景才有办法『成功执行』

虽然昨天达成了建构一个 『瘦瘦的』image ,但是在建构的过程当中如果需要很多额外应用的话仍复杂
docker 在 17版後引进了一个叫做 multistage build 这个厉害的东东

multistage build 使我可以在单一 dockerfile 中编排复杂的 build 工作
可以定义一个 or 多个 parent image
可以建立编译过程中需要的所有环境
最後 只复制必要的素材到下一阶段,就能获得最低限度可以使用的轻量化 image

准备一个 app.c

#include <stdio.h>
void main(){
printf("Try multistage build");
}

准备一个 multistage Dockerfile

FROM gcc:7.2 AS builder
COPY src /src
RUN gcc -static -o /src/app /src/app.c && strip -R .comment -s /src/app

FROM scratch 
COPY --from=builder /src/app .
CMD ["./app"]

资料夹分布如下
https://ithelp.ithome.com.tw/upload/images/20210929/20119546MHV4vHHGUw.png

build

docker build -t multistage .

https://ithelp.ithome.com.tw/upload/images/20210929/201195464UrjnFlsSW.png

run

docker run --rm multistage

https://ithelp.ithome.com.tw/upload/images/20210929/20119546pgan9OU4SS.png
成功印出 app.c 中 printf 的内容

在这个 dockerfile 中,作了两次的 FROM
第一次建立一个静态执行档
第二次 FROM scratch 只 COPY 了 静态执行档
https://ithelp.ithome.com.tw/upload/images/20210929/20119546vIlOm4HSpF.png

可以看到这次 build 出来的 image 跟 trytry/nginx image 的容量差异
232000/738 ≒ 314 倍

去除了大部分的 docker image history
增加了 携带/传送 的方便性


<<:  Day16 JavaScript基本教学(一)

>>:  【Day30】回顾与完赛心得

Day39 ( 游戏设计 ) 青蛙过河

青蛙过河 教学原文参考:青蛙过河 这篇文章会介绍,如何在 Scratch 3 里使用多个角色,搭配重...

[Q&A] 06 风险评监报告生出来前的修修改改

资讯安全管理制度运行过程中,会对即有的企业或机构文化带来一定的冲击。 顾问有教过、学员有学过都是真的...

成员 18 人:

撰写中 在求发展的道路上,又过了一日...... 这时,成员 18 人。 ...

DAY 16 『 改用 xib 进行界面创作 』

storyboard 有三个概念是最容易混淆: xib:实际是个xml文件,xib = XML n...

强型闯入DenoLand[35] - 完赛心得

强型闯入DenoLand[35] - 完赛心得 年度回顾 今年对笔者我来说是相当特别的一年,从升上...