Автоматическое восстановление программ Go - с Docker, Glide и Fresh

Вступление

Разработка приложений Go часто может быть утомительной, особенно если приложение Go - это сервис в более крупной экосистеме, который вам нужно запускать локально во время разработки.

Каждый раз, когда мы вносим изменения в наш код, нам приходилось уничтожать наш контейнер Docker, заново собирать двоичный код Go и повторно запускать контейнер Docker. Это неэффективно и легко может быть автоматизировано. Давайте приступим, ладно?

Я предполагаю, что вы знаете основы работы программ Go и способы их разработки. Я также предполагаю, что вы знаете, что такое Docker и контейнеры.

Настройка Fresh & Glide

Проблема, с которой мы сталкиваемся здесь, заключается в том, что нам остается перестраивать двоичный файл, когда мы изменяем код. Это было бы утомительно и потеряло бы так много времени.

Нам нужно что-то, что может просто пересобрать двоичный файл на лету при изменении файлов. К счастью, кто-то уже подумал об этом, поздоровайтесь с Fresh.

Fresh - это программа Go, которую вы можете включать и запускать вне и внутри контейнера Docker, она будет следить за файлами, пересобирать ваш двоичный файл и запускать его.

По умолчанию он будет искать файл с именем runner.conf, в данном случае мы используем тот, который они предоставили по умолчанию.

Запустите go get github.com/pilu/fresh и запустите fresh, чтобы начать.

Он отлично работает и, безусловно, делает то, что нам нужно.

Мне нравится Fresh, единственное, что меня беспокоит, так это то, что он не загружает новые файлы; хотя простое сохранение или «касание» существующего файла вызовет повторную сборку.

На очереди Glide, go get на стероидах. Это менеджер пакетов, сравнимый с npm или Composer. Я очень рекомендую это разработчикам Go, это облегчает жизнь!

По сути, это красивая обертка вокруг «иди и работай» с файлом конфигурации, блокировкой версий и кешированием. Почему бы тебе не использовать это?

Из-за ограничений Fresh он может просматривать только определенное количество файлов одновременно, поэтому нам придется игнорировать нашу папку Glide vendor. Фууууу.

Простым обходным путем для этого было бы запустить glide update && touch main.go таким образом, чтобы мы запустили наблюдатели Fresh для повторной сборки, как только мы обновим наши зависимости Glide, хорошо, правда?

Просто добавьте vendor в «игнорируемый ключ» в вашей конфигурации Fresh, например так (это не позволит Fresh жаловаться на слишком много файлов для просмотра):

ignored: assets, tmp, vendor

Эта настройка до сих пор работала бы блестяще, если вы работаете за пределами экосистемы Docker, поэтому теперь мы рассмотрим возможность интеграции ее в простое решение Dockerfile, которое вы можете запускать вместе с другими контейнерами Docker.

Настройка Docker

Если вы еще не установили и не настроили Docker, пожалуйста.

Вместо того, чтобы запускать команды прямо в терминале; мы создадим образ Docker на основе официального образа golang:alpine. Оставляем только команды, которые нам нужно будет запускать вручную: glide update && touch main.go и типичную команду «Docker run», когда мы добавляем / удаляем / обновляем зависимости Glide, без необходимости самостоятельно перестраивать двоичные файлы или контейнеры.

Создайте Dockerfile со следующим содержимым:

# create image from the official Go image
FROM golang:alpine
RUN apk add --update tzdata \
    bash wget curl git;
# Create binary directory, install glide and fresh
RUN mkdir -p $$GOPATH/bin && \
    curl https://glide.sh/get | sh && \
    go get github.com/pilu/fresh
# define work directory
ADD . /go/src/project_folder
WORKDIR /go/src/project_folder
# serve the app
CMD glide update && fresh -c runner.conf main.go

Замените «project_folder» именем папки вашего проекта.

А чтобы Glide правильно функционировал вне образа Docker, ваш проект должен быть в вашем $GOPATH, как в Dockerfile, поэтому $GOPATH/src/project_folder

Выполните следующую команду в корне вашего проекта (где бы ни находились ваши файлы Dockerfile и main.go), чтобы загрузить контейнер:

docker run -it --volume=$(PWD):/go/src/project_folder --name=my_project_name image_name

И если мы запускаем его вместе с другими контейнерами в сети Docker, нам нужно будет добавить к этой команде флаг сети, поэтому, если у вас есть сеть с именем my_app, это будет:

docker run -it --volume=$(PWD):/go/src/project_folder --name=my_project_name --network=my_app image_name

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

Это должно быть все, что вам нужно, чтобы начать писать потрясающие программы Go с автоматическим пересбором с управляемыми зависимостями, работающими в контейнере Docker. *Дай пять*

Примечание. Я не рекомендую использовать эту настройку для производственных приложений!

Удачи, получайте удовольствие!