Запустите образ докера весенней загрузки с другой конфигурацией в компоновке докеров

avatar
Herval NGANYA
8 августа 2021 в 18:04
351
1
1

Здравствуйте, я начинаю с docker и docker compose, и у меня возникает следующая проблема:

Я работаю в архитектуре микросервисов spring, где у меня есть одна служба конфигурации, одна служба обнаружения, одна служба шлюза и несколько служб ресурсов. Для запуска этих служб я создаю файлы jar, которые помещаю в отдельную папку для каждой службы с их файлами конфигурации (application.yml и bootstrap.yml): например:

  • служба конфигурации/

    • config-service.jar
    • application.yml
  • служба обнаружения/

    • discovery-service.jar
    • bootstrap.yml
  • служба шлюза/

    • шлюз-service.jar
    • bootstrap.yml
  • crm-service/

    • crm-service.jar
    • bootstrap.yml

Пока это работает на моем сервере.

Теперь я хочу развернуть свои службы в различных средах в виде образов докеров (созданных с помощью образа сборки mvn и пакета сборки) с помощью компоновки докеров, где файлы конфигурации различаются в зависимости от среды. Как я могу развернуть службу как контейнер, используя существующий образ, но с другим файлом конфигурации?

Заранее спасибо!

Источник
The Fool
8 августа 2021 в 18:09
1

Вы можете поместить все свои файлы в этот образ, а затем использовать переменную среды, чтобы выбрать тот, который вы хотите использовать при запуске. Хотя не уверен, что это будет хорошей практикой. Я думаю, что лучше делать это при сборке с помощью аргумента сборки и копировать только тот файл, который вам нужен. docs.docker.com/compose/compose-file/compose-file-v3/#build.

Ответы (1)

avatar
g00glen00b
8 августа 2021 в 18:46
1

Есть несколько возможностей при обработке конфигурации в контейнерной среде.

Один из вариантов заключается в том, что загрузка Spring позволяет использовать переменные среды для каждого свойства приложения. Например, предположим, что у вас есть свойство spring.datasource.url, в этом случае вы также можете определить это свойство, установив переменную среды SPRING_DATASOURCE_URL:

version: '3.8'

services:
  my-spring-boot-app:
    image: my-image:0.0.1
    environment:
      - SPRING_DATASOURCE_URL=jdbc:my-database-url

В качестве альтернативы вы можете использовать тома для размещения внешнего файла в определенном месте внутри контейнера:

version: '3.8'

services:
  my-spring-boot-app:
    image: my-image:0.0.1
    volumes:
      ./my-app/bootstrap.yml:/etc/my-app/bootstrap.yml

В этом примере я копирую bootstrap.yml из соответствующей папки на моем хост-компьютере в /etc/my-app внутри контейнера. Если вы поместите эти файлы в ту же папку, что и файл JAR, вы сможете переопределить конфигурацию.

The Fool
8 августа 2021 в 19:06
1

Тома для монтирования конфига в prod — очень плохая идея.

Herval NGANYA
9 августа 2021 в 12:23
0

@ g00glen00b Большое спасибо за ответ. Я попробовал первый вариант, который работает отлично. Но проблема в том, что для моей службы ресурсов настроено несколько свойств, и некоторые из этих свойств одинаковы для нескольких служб. Я считаю, что повторять конфигурации и настраивать множество свойств в файле docker-compose не так уж и круто. По этой причине я хотел бы использовать предоставленную вами альтернативу. Но вопрос: где мне найти файл jar в контейнере? Напоминаю, что образ был сгенерирован с помощью maven build-image.

Herval NGANYA
9 августа 2021 в 12:26
0

@TheFool Почему не рекомендуется монтировать конфигурацию в prod?

The Fool
9 августа 2021 в 12:53
0

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

Herval NGANYA
9 августа 2021 в 16:11
1

Я мог бы улучшить концепцию и построить то, что я хочу. Спасибо вам, ребята. Вот моя концепция: - Я использую переменные окружения - Для каждого сервиса я создаю отдельный файл. например, service1.env, service2.env и т. д. — Затем я вызываю эти файлы в файле docker-compose.yml следующим образом: service1: env_file: — 'service1.env’ — Затем для общих переменных службы я могу либо иметь файл . env в той же папке, что и файл docker-compose, или добавьте общий файл env в раздел env_file. coderhelper.com/a/48651071/8182381

Herval NGANYA
9 августа 2021 в 20:07
0

Только еще вопрос, пожалуйста. В моих службах ресурсов у меня есть, например, пользовательское свойство app.my-url в моем bootstrap.yml, к которому я обращаюсь в своем приложении с помощью @Value (""). Нельзя ли настроить это также с помощью переменных среды? Пока это не работает.

The Fool
10 августа 2021 в 06:50
0

@HervalNGANYA, я думаю, вы должны иметь возможность изменить свой код, чтобы напрямую читать env var. Если это невозможно, то, что я делал в прошлом, я прочитал env vars в сценарии entrypoint и записал его в файл при запуске контейнера. Я написал сообщение в блоге о точках входа, которые могут вам помочь, если вам действительно нужно идти по этому пути. Я бы постарался избежать этого, если это возможно. dev.to/codingsafari/…

The Fool
10 августа 2021 в 06:57
0

@HervalNGANYA, вот то, что вы ищете, возможно, coderhelper.com/questions/33125614/…. Я действительно не пишу Java-приложения, поэтому я не уверен.

g00glen00b
10 августа 2021 в 21:32
0

@HervalNGANYA Свойства в bootstrap.yml немного особенные. Если вы хотите заменить их переменными среды, вам нужно сделать что-то вроде этого: cloud.spring.io/spring-cloud-commons/multi/…