Multi-stage builds are a new feature requiring Docker 17.05 or higher on the daemon and client.
With multi-stage builds, you use multiple FROM
statements in your Dockerfile. Each FROM
instruction can use a different base, and each of them begins a new stage of the build. You can selectively copy artifacts from one stage to another, leaving behind everything you don’t want in the final image.
FROM golang:1.7.3 WORKDIR /go/src/github.com/alexellis/href-counter/ RUN go get -d -v golang.org/x/net/html COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=0 /go/src/github.com/alexellis/href-counter/app . CMD ["./app"]
You only need the single Dockerfile. You don’t need a separate build script, either. Just run:
docker build . # or docker build -t pepa/href-counter:latest .
By default, the stages are not named, and you refer to them by their integer number, starting with 0 for the first FROM
instruction. However, you can name your stages, by adding an AS <NAME>
to the FROM
instruction. This example improves the previous one by naming the stages and using the name in the COPY
instruction.
FROM golang:1.7.3 AS builder WORKDIR /go/src/github.com/alexellis/href-counter/ RUN go get -d -v golang.org/x/net/html COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /go/src/github.com/alexellis/href-counter/app . CMD ["./app"]
When you build your image, you don’t necessarily need to build the entire Dockerfile including every stage. You can specify a target build stage. The following command assumes you are using the previous Dockerfile
but stops at the stage named builder
:
docker build --target builder -t alexellis2/href-counter:latest .