LINUX.ORG.RU

как деплоить новый go в старые дистрибутивы?

 , ,


0

4

Есть проект на go 1.20.6, в нём используется go works, а модули рассортированы по директориям в internal. Точка входа — модуль cmd/main. Локально go mod download работает, а в cmd/main я просто делаю go build.

Но как это всё задеплоить на сервер? /lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.32' not found я не смог победить, как ни пытался: новый glibc как всегда не собирается, а опакеченным я его не нашёл. После CGO_ENABLED=0 тоже крашится.

Хотелось бы докеризовать — это более правильный путь. Но в контейнере go в упор не видит модули, какой WORKDIR не используй. Нету их и всё тут. Соответственно, зависимости не выкачиваются и бинарник не собирается. Все найденные рецепты относятся к старым версиям, без works. А мне надо именно с works. Ничего путного не нашёл.

Помогите неосилятору.

★★★★★

Хотелось бы докеризовать — это более правильный путь. Но в контейнере go в упор не видит модули, какой WORKDIR не используй.

Просто, чтобы отсечь варианты:

  1. Го 1.18+?
  2. Скопирован директорий вместе с go.work?
  3. Скопированы и go.mod тоже, всё необходимые?
  4. Выполнено go mod download?
  5. Переменные окружения не вносят неразберихи?
thegoldone ★★
()

Так ты в докере пытаешься компилить модули из go в native? А кросс компиляцию не пробовал? Чтобы статически один бинарник собрать и положить уже его в докер контейнер. Или собрать статически на новом линукс дистре, и на нём контейнизировать один статический файл исполняемый для более старых версий

menangen ★★★★★
()
Ответ на: комментарий от menangen

Не, плохая идея. Допустим, бинарник в докере запускается. Но как тогда организовывать CI/CD или просто на dev сервере собирать? Пусть лучше прямо в докере собирается. А со статикой я сильно натрахаюсь.

InterVi ★★★★★
() автор топика
Ответ на: комментарий от thegoldone

Прошёлся по чек-листу, в итоге оказалась банальность — прописал неправильные пути, поэтому файлы не копировались. А правильно вот так:

FROM golang:1.20.6

COPY . /src/
COPY ./configs/.env /app/

WORKDIR /src/cmd/main
RUN go build -o /app/main

WORKDIR /app
EXPOSE 8000
ENTRYPOINT [ "/app/main"]

Теперь деплоится как положено.

InterVi ★★★★★
() автор топика
31 октября 2023 г.
Ответ на: комментарий от InterVi

Вы перепутали понятия сборка и разворачиание(деплой).

У вас тут происходит сборка приложения в докер-контейнере и поэтому непонятно, при чём тут деплой.

FireFighter ★★★
()
Последнее исправление: FireFighter (всего исправлений: 1)
Ответ на: комментарий от InterVi

Сборка — часть деплоя.

В идеале, она не должна быть. В идеале ты собираешь «пакет», потом его заливаешь на тестовое окружение, еще куда-то, и хоть через месяц уже заливаешь на прод.

urxvt ★★★★★
()
Ответ на: комментарий от FireFighter

В идеальном мире, где единороги какают бабочками — да. В реальности, где повсюду говнокод и странные инженерные практики, сборка — часть деплоя.

А ещё IT не ограничивается кровавым энтерпрайзом с его кубернетесами на миллиард инстансов. Есть много маленьких проектов, которые деплоятся на 1 сервер, в них сборка всегда часть деплоя.

InterVi ★★★★★
() автор топика
Ответ на: комментарий от urxvt

Это если есть несколько серверов, где один как раз отвечает за CD. Или если это открытый проект. Тогда да, правильный путь — собрать какой-нибудь докер образ, который все потом просто накатят. Выше ответил, почему это не всегда так.

InterVi ★★★★★
() автор топика
Ответ на: комментарий от InterVi

Даже в маленьком проекте это очень полезно. Представь, у тебя есть поделка на Го. Ты закатил новую версию на сервер. Она оказалась сломана, ты пытаешься откатиться и... старая версия уже не собирается, так как Гитхаб (Maven Central в случае Java) прилег. Все! ты приехал. Сервер лежит.
Понятно, что в жизни не всегда следуют правилам и сознательно упрощают процессы, выбрасывают какие-то шаги. Трудовых ресурсов на это часто не хватает. Но это разные процессы, как ни крути.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Не обязательно удалять старый образ докера или старые билды. Обычно это делается руками, но и сценарий CI можно так написать, чтобы последние n версий оставались.

InterVi ★★★★★
() автор топика
Ответ на: комментарий от InterVi

Обычно есть два разных процесса:

  1. Сборка, в результате которой из исходника собирается некий артефакт.
  2. Развёртывание, артефакт доставляется из репозитария в нужное окружение.

Их, конечно, можно проводить последовательно один за одинм, но это всё равно два разных процесса.

ugoday ★★★★★
()
Ответ на: комментарий от InterVi

Да хоть у себя на локалхосте собирай и разворачивай. Одним процессом это всё равно не станет. )

Я дискуссию развел потому, что в стартовом сообщении понятия смешаны в кучу и не понятно что в итоге нужно-то было.

FireFighter ★★★
()
Ответ на: комментарий от FireFighter

Мне это всё равно не налезает на мозг. Маленькие проекты собираются/деплоятся примерно такими конфигами докера, как я тут показал. С обозначением слов условно понятно (хотя они новые и не устоявшиеся, в каких-то описаниях сборка входит в деплой, нужны комментарии академиков и добавление в словари), но в реальности это один процесс, запускаемый одной командой. Даже CI, которые заточены на правильный деплой, где он отдельный процесс от сборки, настраивают как запускалку сборочных скриптов по ssh, а собранный образ не используется.

Мне нужен был деплой. Собрать то я собрал, но на сервере со старыми библиотеками нифига не запустилось, пришлось упаковать в докер.

InterVi ★★★★★
() автор топика
Ответ на: комментарий от InterVi

В разрезе приложений написаных на GO:

  • Сборка: компиляция бинарника
  • Деплой:
    • Копирование бинарника
    • Запуск бинарника

В разрезе докер-образов:

  • Сборка: docker build -t <tag> .
  • Деплой: docker run <tag>
FireFighter ★★★
()
Ответ на: комментарий от Zhbert

Раскрою мысль.

  1. У тебя в докер-файле описан сборочный контейнер и продовый.
  • В сборочном все, что нужно для сборки: го, либы и прочая хрень. В него копируешь или монтируешь сорцы и собираешь бинарник
  • В этом же докерфайле копируешь полученный артефакт (бинарник собранный) в чистый контейнер, в котором он будет запускаться. Если надо, предварительно туда же ставишь что-то нужное из библиотек или хз, что там тебе надо.
  1. На выходе у тебя образ, в котором только твое приложение. Его и запускаешь, хранишь в реджистри и так далее. Остальной хлам от сборки остается в сборочном контейнере. Последний тоже можно сохранить в реджистри, чтобы не собирать каждый раз, а использовать кеш.
Zhbert ★★★★★
()
Последнее исправление: Zhbert (всего исправлений: 2)
Ответ на: комментарий от Zhbert

Для твоего случая весь твой деплой сведется к паре команд: собрать контейнер, запустить его. В идеале, собрать, залить в реджистри и оттуда запустить на сервере, чтобы не забивать сервер хламом от сборки.

Zhbert ★★★★★
()