Многоступенчатая сборка 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"]

должен привести к небольшой емкости контейнера.

Другие вопросы по тегам