使用Docker多阶段构建来减小镜像大小的方法

2020-06-17 06:11:02易采站长站整理

为阶段添加名字很简单,只需要在 FROM 后加上 as <name> 即可。

现在,我们更新 Dockerfile,给予阶段名称并使用名称来 COPY。


# Stage 1, it's name is "build1"
FROM alpine:3.8 as build1
WORKDIR /demo
RUN echo "Hello, stage 1" > /demo/hi-1.txt

# Stage 2, it's name is "build2"
FROM alpine:3.8 as build2
WORKDIR /demo
# No longer use indexes
COPY --from=build1 /demo/hi-1.txt /demo
RUN echo "Hello, stage 2" > /demo/hi-2.txt

重新构建并保存,结果应该同上次相同。

仅构建部分阶段——轻松调试

Docker 还为我们提供了一个很方便的调试方式——仅构建部分阶段。它可以使构建停在某个阶段,并不构建后面的阶段。这可以方便我们调试;区分生产、开发和测试。

仍然沿用上次的 Dockerfile,但使用 –target <stage> 参数进行构建:


$ docker build --target build1 .

再次 Save,你会发现只有 build1 的内容。

总结

这就是多阶段构建的全部用法了。我们再回到开篇的两个 Dockerfile 对比,你能发现优化前的镜像胖在哪里了吗?

很显然,它包含了无用的 JDK,JDK 只在编译时起作用,编译完便无用了,只需要 JRE 即可。所以,利用多阶段构建可以隔离编译阶段和运行阶段,以达到镜像最优化。

参考文献

https://docs.docker.com/develop/develop-images/multistage-build/#name-your-build-stages

https://yeasy.gitbooks.io/docker_practice/image/multistage-builds.html

您可能感兴趣的文章:Docker 搭建私有仓库(registry、harbor)详解基于Harbor搭建Docker私有镜像仓库Docker安装常用组件(mysql,redis)的方法基于Docker的Etcd分布式部署的方法步骤Docker-compose一键部署gitlab中文版的方法步骤Docker部署Spring-boot项目的示例代码Docker如何实现修改Docker0网桥默认网段Docker实现同Ip网段联通的实现Docker容器化部署尝试——多容器通信(node+mongoDB+nginx)linux使用docker-compose部署软件配置详解Docker能否成为下一个“Linux”?Docker-compose部署gitlab的方法步骤详解Docker Compose 中可用的环境变量问题Docker容器的创建、启动、和停止的方法docker私库Harbor的架构与组件说明