Как должен быть собран Docker-образ онлайн-проекта Go?

Go

Предыдущая статья:Практика по началу работы с Kubernetes — развертывание и запуск проектов GoПосле релиза некоторые пользователи сети оставили сообщение о том, что образ, продемонстрированный в моей статье, предназначен для упаковки файлов проекта и перехода в образ, поэтому образ будет занимать много места.

GoПосле компиляции разработанной программы в бинарный файл ее можно установить без инсталляции.GoСистемная среда в исполнении, если только скомпилированные двоичные файлы непосредственно в зеркало в зеркале могут сэкономить много места. Я дал ответ, в центре внимания статьиKubernetesПоэтому зеркальный аспект не занимает слишком много места.

Это правда, что зеркала приложений реальных онлайн-проектов, как правило, строятся не так, как в предыдущей статье, потому что требования различных аспектов производственных проектов более строгие. Процесс построения изображения обычно используется в первую очередь.DockerКонтейнер компилирует проект в двоичные файлы, а затем копирует скомпилированные файлы в новый образ контейнера, который обычно содержит толькоLinuxСамые основные файлы, необходимые для работы системы, не обязательно иметьGoокружающей среды, поэтому он может уменьшить много места. Весь процесс происходит в процессе построения изображения, поэтому можно гарантировать согласованность нескольких сред.DockerМетод зеркалирования называется многоэтапной сборкой (multi stage build).

Многоступенчатые сборки17.05Эта функция доступна только в версии, поэтому вы должны сначала определить, какую функцию вы используете, прежде чем использовать ее.Docker Engineверсия.

Вот как это использоватьDockerмногоэтапное сборочное производствоGoЗеркало приложения.

Отражено в предыдущей статьеDockerfileЭто выглядит так:

FROM golang:1.14-alpine
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN go build -o main . 
CMD ["/app/main"]

После того, как мы создадим образ, используя многоэтапную сборку,Dockerfileстанет примерно таким:

FROM golang:alpine AS build

RUN mkdir /app
COPY . /app
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp

### 
FROM scratch as final
COPY --from=build /app/myapp .
CMD ["/myapp"]

Goзаявка на проектDockerfileОбычно примерно так, но детали каждого проекта могут различаться.FROM golang:alpineбазовый образ (который содержит инструменты и библиотеки Go для создания программ), указывающий начальную стадию,AS buildназвать этот этапbuild.

golang:alpineуказанныйGoбазовое изображениеalpineВерсия,alpineэто небольшой размер, специально разработанный для контейнеровLinuxвыпуск. этоDockerfileиспользуется дважды вFROMДиректива, статья 2FROM scratchок, говоритDockerНачните заново со свежего, совершенно пустого образа контейнера и скопируйте в него программу, скомпилированную с предыдущего этапа. Это то, что мы будем использовать для запускаGoОбраз контейнера приложения.

scratchзеркальное отображениеDockerНаименьшее изображение, заданное проектом.Dockerиспользуется дляGoРаспространены многоступенчатые сборки программ с использованиемscratchЗеркалирование экономит много места, потому что нам на самом деле не нужноGoинструмент или что-нибудь еще для запуска нашей скомпилированной программы, которая также может бытьGoПреимущество в эпоху контейнеров.

использоватьscratchзеркальныйGoОбраз приложения будет иметь проблемы с распознаванием часового пояса во время работы Это также наш недавний проект.KubernetesПервая проблема возникла при миграции, но, к счастью, послеGoogleи посмотретьGoЗагрузка исходного кода часового пояса нашла решение, и я расскажу, как его решить в следующей статье.