Многоступенчатая сборка образа Docker
12.03.2022
Теория
Многоступенчатая сборка в основном нужна для компилируемых языков программирования (С, Golang, C#, Java и так далее). Она позволяет исключить из конечного образа компилятор, соответственно уменьшает его вес.
Например:
- Установка компилятора и компиляция
- Запуск уже скомпилированного образа
При этом итоговым будет последний (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’, но другого я придумать не смог.
Ссылки
Содержание