Леонид МаслаковLenpaste

Многоступенчатая сборка образа Docker

12.03.2022

Теория

Многоступенчатая сборка в основном нужна для компилируемых языков программирования (С, Golang, C#, Java и так далее). Она позволяет исключить из конечного образа компилятор, соответственно уменьшает его вес.

Например:

  1. Установка компилятора и компиляция
  2. Запуск уже скомпилированного образа

При этом итоговым будет последний (2-ой) образ.

Практика

Вот пример многоступенчатой сборки Golang приложения:

# Этап 1: сборка и компиляция
# 'as build' - задаёт имя этапа
FROM golang:1.15.15-alpine as build

WORKDIR /build

COPY . ./

RUN mkdir -p ./dist && \
go build -ldflags="-w -s" -o ./dist/myapp ./cmd/myapp.go


# Этап 2: создание финального образа
# 'as run' - задаёт имя этапа
FROM alpine:latest as run

WORKDIR /

# Копирует результат сборки из этапа `build` в этап `run`
COPY --from=build /build/dist/myapp /usr/bin/myapp

EXPOSE 80/tcp

CMD [ "/usr/bin/myapp" ]

PS: возможно ‘этап’ это не очень корректный перевод английского слова ‘stage’, но другого я придумать не смог.

Ссылки