Dockerのmulti-stage builds

業務でAerospikeのPrometheusのexporterを使う機会があり、
そのDockerfileを見てみたところFROMが2個書いてありなんだろうと思っていましたが
Docker17.05系からサポートされたmulti-stage buildsという機能でした。

asprom/Dockerfile at master · alicebob/asprom · GitHub

FROM golang:1.9.2 AS build
ADD . /work
WORKDIR /work
RUN go build -o hello main.go

FROM alpine:3.6
COPY --from=build /work/hello /usr/local/bin/hello
ENTRYPOINT ["/usr/local/bin/hello”]

上記のように1つ目のFROMではgolangのイメージでgoのビルドだけを行っています。
またASで中間イメージにbuildという名前を付けています。

その後、2個目のFROMのalpineイメージではCOPY --from=buildと、先ほどASで中間イメージに名前を付けた名前を指定してビルドしたファイルをコピーしてきて実行させます。

これによりビルドはgolangイメージで行わせてイメージサイズが膨れ上がっても実行させるだけのalpineは軽量なサイズのままで済みます。