Многоступенчатая сборка Docker для Golang создать большое изображение
Я хочу использовать многоэтапную сборку для моего проекта gaoling, когда я собираю проект локально для linux/windows/Mac, я получил 12,6 МБ размера, в настоящее время у меня небольшая программа CLI для gaoling.
Теперь я хочу собрать его, чтобы создать из него светлое изображение докера с scratch
вариант и построить as
Я использую следующее, но когда я проверяю изображение, я вижу, что размер его 366MB
Любая идея, что я здесь скучаю? Это должно быть меньше, чем 20 МБ...
#build stage
FROM golang:alpine as builder
WORKDIR /go/src/tzf
ADD . /go/src/tzf
RUN CGO_ENABLED=0 go build -ldflags '-extldflags "-static"' -o ova tzf
RUN apk add --no-cache git
FROM golang:alpine
RUN mkdir /build
ADD . /build/
WORKDIR /build
RUN CGO_ENABLED=0 go build -ldflags '-extldflags "-static"' -o ova tzf
FROM scratch
COPY --from=builder /build/main /app/
WORKDIR /app
CMD [“./ova -v"]
2 ответа
Когда вы создаете свое окончательное изображение, будьте осторожны, чтобы скопировать только те файлы, которые вы хотите получить в образе. Здесь имеет смысл сделать ваш двоичный файл ТОЧКОЙ ВВОДА изображения, поскольку с ним буквально больше ничего нельзя сделать.
Я мог бы сделать двухэтапный конвейер примерно так:
# size of this stage doesn't matter; use the standard image
FROM golang AS builder
WORKDIR /go/src/tzf
ADD . ./
RUN CGO_ENABLED=0 go build -ldflags '-extldflags "-static"' -o /ova tzf
FROM scratch
# only copy the one file, may as well put it in /
COPY --from=builder /ova /ova
ENTRYPOINT ["/ova"]
# if you want to launch it with default options, you can
# CMD ["-v"]
Вы должны использовать сначала golang:alpine
контейнер для сборки приложения, затем alpine
запустить скомпилированное приложение.
Что-то вроде этого:
# builder
FROM golang:alpine AS builder
WORKDIR /go/src/tzf
ADD . /go/src/tzf
RUN CGO_ENABLED=0 go build -ldflags '-extldflags "-static"' -o ova tzf
# runner
FROM alpine
WORKDIR /app
COPY --from=builder /build/main /app/
CMD [“./ova -v"]
должен привести к небольшой емкости контейнера.