为阶段添加名字很简单,只需要在 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的架构与组件说明










