Go сборка dockerized, кэширование уровня извлечения зависимостей - PullRequest
0 голосов
/ 07 апреля 2020

Я отлично провожу время, используя skaffold для разработки некоторых сервисов kubernetes, но один из самых длинных шагов в моем цикле - извлечение всех зависимостей для контейнера.

Есть ли у кого-нибудь рекомендации по Как я могу лучше всего кэшировать все зависимости в слое? Существуют ли передовые практики по созданию go двоичных файлов внутри docker контейнеров? Должен ли я иметь слой, где я делаю go get? (Также я новичок в создании go двоичных файлов, пока не знаю всех наворотов.)

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Я согласен с Григорием Михалкиным. Что касается ваших улучшений производительности, я хочу назвать Docker Build Enhancements , которые основаны на moby / buildkit . На момент написания статьи инструменты не были должным образом документированы, но с некоторыми пробами и ошибками вы могли бы найти свое решение.

Используя buildkit, вы можете использовать кеш в ваших операторах RUN, чтобы сократить время последующих казней. Они также предоставляют пример Go в своих документах . Чтобы это работало, вы должны включить экспериментальные функции как для демона Docker, так и для клиента (описано по ссылке выше).

0 голосов
/ 21 апреля 2020

Я нашел эту статью после того, как погуглил еще несколько, которые охватывают процесс: Использование go мод загрузки для ускорения Golang Docker сборок

Суть хитрости заключается в том, чтобы скопировать файлы go.mod и go.sum в контейнер, затем запустить go mod download для загрузки зависимостей, а затем на другом шаге продолжить сборку.

Это работает, потому что ваш файлы go.mod и go.sum не изменяются , если вы не добавите больше зависимостей. Таким образом, когда происходит следующий оператор RUN, который go mod download docker знает, что он может кэшировать этот слой. ( Источник )

FROM golang:1.13.9-buster as builder

# Make Build dir
RUN mkdir /build
WORKDIR /build

# Copy golang dependency manifests
COPY go.mod .
COPY go.sum .

# Cache the dependency download in a layer.
RUN go mod download

# add the source code
COPY . .
# Build
RUN go build -o app

# Run
FROM debian:buster-slim
COPY --from=builder /build
WORKDIR /app
CMD ["./app"]
0 голосов
/ 07 апреля 2020

Обычно используется многоэтапная сборка для go сервисов. Таким образом, все разрешенные и исполняемые зависимости строятся на этапе сборки. И последний этап - запуск исполняемого файла. В результате ваше окончательное изображение будет более тонким по размеру. Хотя это не ускорит этап разрешения зависимостей.

...