Доступ к сети докеров во время сборки docker-compose v2? - PullRequest
0 голосов
/ 22 сентября 2019

Сводка

Имея файл docker-compose.yml, который создает образ, подобный следующему:

services:
  my-service:
    build: 
      context: My.VS.AppFolder
    networks:
      - my-docker

networks:
  my-docker:
    external: true

указанная сеть доступна только в ENTRYPOINT.Но не во время сборки.Как получить доступ к другому контейнеру в той же сети my-docker во время сборки Dockerfile?

Вариант использования: выборка пакетов NuGet из частного репозитория

Описание варианта использования

У меня есть веб-приложение ASP.NET Core MVC 2.1.Для лучшего разделения проблем я хочу реализовать определенные функции в другом отдельном веб-приложении (например, в интерфейсе администратора).Чтобы избежать копирования общих вещей, таких как макет приложения (Razor) или некоторые вспомогательные служебные классы, я создал общий проект для этих вещей.

Итак, сейчас есть три проекта:

  • MyApp (Исходное приложение)
  • MyApp.Core (Для общих вещей)
  • MyApp.Admin

Поскольку на MyApp.Core нужно ссылаться из других проектов, я установил BaGet как простой NuGetхостинг репо для моей среды сборки докеров.На этот контейнер есть внутренняя ссылка с его DNS-именем в nuget.config, созданная на уровне решения MyApp (то же самое для нового MyApp.Admin, но для простоты давайте сосредоточимся на MyApp).

Проблемы

В Dockerfile из MyApp Я делаю сейчас это:

RUN dotnet restore --configfile nuget.config

и мне нужен доступ к имени DNS под названием bagetв сети my-docker. Исследования показывают, что это возможно только по крайней мере с версией 3.4 docker-compose, и, кажется, до сих пор официально не задокументировано.Но Docker удалил несколько опций из v2 в v3 , например, ограничения ресурсов, такие как mem_limits, который я использую.Начиная с версии 3, они доступны только с использованием роя, а не на отдельных узлах.

Таким образом, в настоящее время я не вижу никакого решения, кроме перехода на v3 и Swarm, которое могло бы вызвать дополнительную работу и сложность без других преимуществ, кроме этой проблемы с сетью.Мой проект не настолько большой, что требуется рой.

1 Ответ

0 голосов
/ 22 сентября 2019

Я нашел два способа решения этой проблемы:

Сборка с помощью инструмента docker cli вместо docker-compose

Вместо docker-compose up -d --build я вручную строю образ с помощью докеровИнструмент CLI, потому что он имеет переключатель --network, который позволяет указывать сеть во время сборки:

docker build --network my-docker -t my-service:latest --build-arg ASPNETCORE_ENVIRONMENT=Development My.VS.AppFolder

Теперь вместо этого создайте ссылку на это изображение в docker-compose.yml:

services:
  my-service:
    image: my-service:latest

После того, как образ был собран, запустите docker-compose up -d без флага --build.Это вызывает некоторые накладные расходы, так как вам приходится выполнять вызовы CLI, а для реальных тегов, таких как alpine-3.2.1, этот тег необходимо указывать с помощью переменной env и передавать в docker / docker-compose.Но, похоже, лучшая рабочая альтернатива для продуктивного использования.

Режим совместимости

В docker-compose имеется переключатель --compatibility, начиная с 1.20.0 , который позволяет использовать новую версию файла v3, но отображать такие параметры, как ressourceпределы локально v2 формы.Другими словами: вы можете использовать указать ressources в v3, и они применяются к docker-compose, когда используется этот переключатель.В противном случае они будут игнорироваться на docker-compose и будут действовать только с docker stack deploy.

Таким образом, с помощью этого переключателя вы можете извлечь выгоду из возможности определения сети во время сборки без потери ограничений на ресурсы. Но документация предупреждает, что это недостаточно стабильно для продуктивного использования:

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

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

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