Автоматическое восстановление программ 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. *Дай пять*
Примечание. Я не рекомендую использовать эту настройку для производственных приложений!
Удачи, получайте удовольствие!