5分钟入手Dockerfile多阶段构建
2019年10月15日
前两天同事在周会上做了Dockerfile构建的分享,手痒,就自己顺手也写一个简单的练练手。
首先准备好源码文件hello.c
和Dockerfile
# 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镜像大许多倍,这就是对阶段构建的妙处。软件编译需要的编译环境,和编译过程都往往会产生许多在运行时用不到的东西,为了保证运行容器的干净和小巧,所以把编译和运行时分开。从而保证运行环境容器的干净整洁!
当前暂无评论 »