Dockerfile 中的 multi-stage(多阶段构建)

分别为软件的编译环境和运行环境提供不同的容器镜像。比如为编译环境提供一个 Dockerfile.build,用它构建的镜像包含了编译软件需要的所有内容,比如代码、SDK、工具等等。同时为软件的运行环境提供另外一个单独的 Dockerfile,它从 Dockerfile.build 中获得编译好的软件,用它构建的镜像只包含运行软件所必须的内容。这种情况被称为构造者模式(builder pattern),本文将介绍如何通过 Dockerfile 中的 multi-stage 来解决构造者模式带来的问题。

获取本文相关的代码):

golang:1.7.3 CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

["./app"]

#!/bin/ Building sparkdevo/href- docker build --no-cache -t sparkdevo/href-counter:build . - docker create --name extract sparkdevo/href- docker extract:/go/src/github.com/sparkdevo/href-counter/app ./ -<span style="color: #0000ff">echo Building sparkdevo/href-<span style="color: #000000">counter:latest

<span style="font-family: Microsoft YaHei">构建运行应用程序的镜像

docker build --no-cache -t sparkdevo/href-counter:latest .

用于生产环境的容器镜像只有 10.3 M,这样的大小在网络间传输的效率是很高的。

$ docker run -e url=https: $ docker run -e url=http:

采用上面的构建过程,我们需要维护两个 Dockerfile 文件和一个脚本文件 build.sh。能不能简化一些呢? 下面我们看看 docker 针对这种情况提供的解决方案:multi-stage。

golang:1.7.3 CGO_ENABLED=0<span style="color: #008080">FROM<span style="color: #000000"> alpine:latest
<span style="color: #008080">RUN
<span style="color: #000000"> apk --no-cache add ca-certificates
<span style="color: #008080">WORKDIR
<span style="color: #000000"> /root/
<span style="color: #008080">COPY
--from=0<span style="color: #000000"> /go/src/github.com/sparkdevo/href-counter/app .
<span style="color: #008080">CMD ["./app"]

$ docker build --no-cache -t sparkdevo/href-counter:multi . -f Dockerfile.multi

$ docker run -e url=https: $ docker run -e url=http:

golang:1.7.3 as builder CGO_ENABLED=0<span style="color: #008080">FROM<span style="color: #000000"> alpine:latest
<span style="color: #008080">RUN
<span style="color: #000000"> apk --no-cache add ca-certificates
<span style="color: #008080">WORKDIR
<span style="color: #000000"> /root/
<span style="color: #008080">COPY
<span style="color: #000000"><span style="color: #ff0000"> --from=builder
/go/src/github.com/sparkdevo/href-counter/app .
<span style="color: #008080">CMD ["./app"]

相关文章

Docker是什么Docker是 Docker.Inc 公司开源的一个基于 LXC技...
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng...
镜像操作列出镜像:$ sudo docker imagesREPOSITORY TAG IMA...
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p...
在 Docker 中,如果你修改了一个容器的内容并希望将这些更改...
在Docker中,--privileged 参数给予容器内的进程几乎相同的权...