昔我往矣

5分钟入手Dockerfile多阶段构建

2019年10月15日

前两天同事在周会上做了Dockerfile构建的分享,手痒,就自己顺手也写一个简单的练练手。

首先准备好源码文件hello.cDockerfile

# ls 
hello.c  Dockerfile

hello.c的内容如下,就是读取环境变量NAME,然后输入Hello <Name>!:

#include<stdio.h>
#include<stdlib.h>

int main(){
  printf("Hello %s!\n", getenv("NAME"));

}

Dockerfile的内容,分2个阶段

  • 第一阶段,编译hello.c文件,生成可执行位二进制文件,hello
  • 第二阶段,把第一阶段的hello复制到地干净的新镜像中。
FROM gcc as builder
RUN mkdir /app
WORKDIR /app
COPY hello.c ./
RUN gcc hello.c -o hello

FROM ubuntu as runner
RUN mkdir /app
WORKDIR /app
COPY --from=builder /app/hello ./
CMD ["./hello"]

运行

# docker build -t hello:v0.1 .  

# docker run --rm  -e NAME="World" hello:v0.1 
Hello World!

# docker run --rm  -e NAME="Life" hello:v0.1 
Hello Life!

对比下gcc镜像和hello镜像的大小:

$ docker images | grep -E "gcc|hello"
hello   v0.1     8c89044ccf6f  43 seconds ago      64.2MB
gcc     latest   201020b8c956  4 weeks ago         1.14GB

可以看到gcc镜像比hello镜像大许多倍,这就是对阶段构建的妙处。软件编译需要的编译环境,和编译过程都往往会产生许多在运行时用不到的东西,为了保证运行容器的干净和小巧,所以把编译和运行时分开。从而保证运行环境容器的干净整洁!

当前暂无评论 »

添加新评论 »