Содержимое ниже с официального сайта Docker.
Используйте многоэтапные сборки
В многоэтапных сборках вы используете несколько операторов FROM в вашем Dockerfile. Каждая инструкция FROM может использовать другую базу, и каждая из них начинает новый этап сборки. Вы можете выборочно копировать артефакты с одного этапа на другой, оставляя на конечном изображении все, что вам не нужно. Чтобы показать, как это работает, давайте адаптируем Dockerfile из предыдущего раздела для использования многоступенчатых сборок.
Dockerfile:
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"]
Вам понадобится только один Dockerfile. Вам также не нужен отдельный скрипт сборки. Просто запустите docker build.
$ docker build -t alexellis2/href-counter:latest .
Конечным результатом будет тот же крошечный производственный образ, что и раньше, со значительным уменьшением сложности. Вам не нужно создавать какие-либо промежуточные изображения, и вам вообще не нужно извлекать какие-либо артефакты в вашу локальную систему.
Как это работает? Вторая инструкция FROM
запускает новый этап сборки с изображением alpine:latest
в качестве основы. Строка COPY --from=0
копирует только построенный артефакт из предыдущего этапа в этот новый этап. Go SDK и любые промежуточные артефакты остаются позади и не сохраняются в окончательном изображении.