業務で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は軽量なサイズのままで済みます。