2016-12-04 3 views
-2

Я хочу построить приложение Go во время сборки образа Docker и установить точку входа изображения в построенное приложение Go. Проблема в том, что мое приложение Go - это подпакет основного пакета и использует некоторые другие подмодули из основного пакета. Этот основной пакет находится в Github как частный репозиторий, поэтому я не могу просто go get внутри контейнера.Устранение зависимостей Go в контейнере Docker

Я попытался настроить диспетчер зависимостей Glide и получить все зависимости вне контейнера в каталоге vendor/, но есть еще одна проблема - glide.lock необходимо будет обновить после каждой фиксации в основном приватном репозитории. Это не решение для меня, потому что я хочу, чтобы другие зависимости были заблокированы.

Есть ли способ создать приложение с последней версией зависимости основного пакета и заблокированными версиями других зависимостей?

+0

https://blog.golang.org/docker здесь хорошая статья для упаковки контейнера докера.вы можете определить весь необходимый пакет и точку входа вашего приложения в DockerFile. – ahankendi

+0

Это не работает из-за частных репозиториев, которые необходимо клонировать вручную в GOPATH или с помощью скольжения, поддерживающего ssh. Также мне нужна версия зависимостей. – kubaj

ответ

0

Это вопрос не вопрос. Это вопрос Докера и безопасности.

Во-первых, это не идеальное решение для создания приложений Go в качестве части сборки. Как правило, вы должны создать бинарный локально на машине ur, ориентированный на установленный вами Dockerfile FROM. Существует нулевая причина не в том, что для каждой машины есть функция Go complier, и вы можете использовать GOOS и GOARCH на любой машине.

Но для вашего использования, используя частное репо, еще более важно не строить внутри вашего контейнера, потому что независимо от того, как вы получаете код в свой контейнер для сборки, у вас будет контейнер с приватными файлами или хуже ваш ключ ssh. Контейнер, который вы должны загружать, размещать и запускать где-нибудь.

Это не идеально, однако вы смотрите на него.

Однако, если вы решили утечки коды и/или ключ, у вас есть только два варианта:

  • git clone частный репо на локальном/сборке машины yhat авторизован доступ к закрытому репо и используйте COPY в файле Docker, чтобы скопировать его.

  • Используйте Dockerfile COPY, чтобы скопировать ключ SSH вашей локальной машины, который вы авторизировали для удаленного репо, в контейнер, чтобы вы могли выполнять команды git (которые вам также понадобятся git и ssh).

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

Что касается управления зависимостями, я никогда не использовал глиссирование; но, я написал популярный ответ о зависимостях версий с /vendor.

How should I use vendor in Go 1.6?

0

Если вы заботитесь только о том, в состоянии go get личные операции РЕПО из контейнера Docker и не против, чтобы скопировать ваш id_rsa при построении его, вы можете просто добавить это в начале вашего Dockerfile:

RUN echo "[url \"[email protected]:\"]\n\tinsteadOf = https://github.com/" >> /root/.gitconfig 
RUN mkdir /root/.ssh && echo "StrictHostKeyChecking no " > /root/.ssh/config 
COPY id_rsa /root/.ssh/id_rsa 
Смежные вопросы