Ошибка «no secure protocol found for repository» или зачем нужен go mod vendor
Привет, Habr! Недавно устроился на новую работу, и снова пришлось настраивать окружение, поднимать локально сервис и делать прочую рутину. Всё бы ничего, НО — наступив на те же грабли, я забыл про существование go mod vendor
и убил почти час, пытаясь понять, почему контейнеры не подтягивают зависимости.
Решения в интернете быстро не нашёл, поэтому решил поделиться им здесь — возможно, кому-то сэкономит время.
TL;DR
Чтобы решить данную проблему, достаточно всего пары строк:
В консоли в директории, где находится go.mod
go mod vendor
Теперь можете собирать образ (только не забудьте скопировать ВСЕ файлы из проекта в образ)
Суть ошибки
go mod download
go: gitlab.services.company/private.git/project.ru@v1.0.3: no secure protocol found for repository
Такая ошибка может появляться, когда Go пытается скачать зависимости из git‑репозитория без HTTPS или SSH (в основном это репозитории из внутреннего контура). В случае vendor
эта проблема уходит, так как зависимости уже на месте.
Что такое vendor
Когда вы имеете дело с модулями в Go, компилятор обычно извлекает все необходимые модули из их онлайн‑источников/репозиториев и сохраняет их в локальном кэше. Этот кэш находится по пути $GOPATH/pkg/mod
или по значению переменной окружения GOMODCACHE
.
Этот механизм удобен, но есть нюансы. Если:
внешний репозиторий становится приватным,
он удаляется (https://github.com/chenzhuoyu/iasm/issues/3),
или в CI/CD-пайплайне нет интернета,
то вы получите ошибку при сборке.
Вот здесь и приходит на помощь вендоринг (если у вас не настроен GOPROXY). Команда go mod vendor
создаёт в вашем проекте директорию vendor
, куда складываются все зависимости. Таким образом, проект становится полностью самодостаточным и не зависит от внешнего интернета. На уровне кода вы продолжаете импортировать пакеты как обычно, но Go теперь будет искать их внутри vendor
.
Важно помнить, что как только в проекте появляется папка vendor
, Go будет ожидать, что все зависимости синхронизированы с go.mod
. И пока этого не произойдёт — сборка завершится ошибкой.
Использование vendor
— это способ повысить надёжность проекта и защититься от неприятностей, когда внешние источники оказываются недоступны

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