Форум программистов, компьютерный форум, киберфорум
Docker, Kubernetes
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/40: Рейтинг темы: голосов - 40, средняя оценка - 4.73
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465

Как прописать в проекте Java ссылку на БД разворачивающеюся в другом сервисе Docker-compose?

15.11.2020, 21:39. Показов 8681. Ответов 25

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Есть проект Java собирающийся в war-архив. Этот проект я пишу у себя на ПК под Windows, поэтому в настройках подключения к БД прописано следующее:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
spring.datasource.url=jdbc:mysql://localhost:3306/db_users?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
 
spring.liquibase.change-log=classpath:liquibase/db.changelog-master.xml
spring.liquibase.url=jdbc:mysql://localhost:3306/db_users?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
spring.liquibase.user=root
spring.liquibase.password=root
Хочу попробовать проект запустить в Docker container. Для этого загрузил 3 образа: tomcat:9.0.39-jdk11-openjdk; mysql; adminer.

Написал следующий YAML-файл для Docker-compose (не уверен, что верный):
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '3.1'
 
services:
 
  authorizationService:
    image: tomcat  
    volumes:
        - E:\Authorization_service_prjct\war_arсhive:/usr/local/tomcat/webapps
    ports:
        - "8888:8080"
    links:
        - "database:db_users"
    depends_on:
        - database
  
  database:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: db_users
 
  PhpMyAdmin:
    image: adminer
    restart: always
    ports:
        - "8181:8080"
    links:
        - database:mysql
В этом файле для доступа сервиса с приложением authorizationService к БД создал ссылку:
XML
1
2
 links:
        - "database:db_users"
Теперь для подключения к БД моя строка подключения в приложении по идее должна выглядеть вот так:
XML
1
spring.datasource.url=jdbc:mysql://database:3306/db_users?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
Но я этого сделать не могу потому что собираю war-фрхив у себя на ПК под Windows и ведь для того чтобы он нормально собрался и запустился в строке подключения должно быть
localhost
, а не
database
.

Как быть?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.11.2020, 21:39
Ответы с готовыми решениями:

Docker-compose mount
Добрый день возможно кто нибудь сможет мне помочь, задача такая что у меня есть два контайнера fastcgi и smtp и я хочу чтобы в контайнере...

Docker-compose на удаленной машине
Подскажите, как правильно производить развертывание приложения с использованием докер. Есть приватный репозиторий в котором лежит...

docker-compose Проблемы с копированием COPY
Привет. Знакомлюсь с докерами. docker-compose.yml: version: "3" services: php: container_name: php_test_cnt ...

25
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
19.11.2020, 20:31  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от korvin_ Посмотреть сообщение
Очевидно, что если запускать что-то не в докере, то никаких докерных имён (database) он не увидит.
Т.е. с хоста в контейнер никак нельзя подключиться?

А для чего мы тогда делаем вот эти пробросы портов?
Bash
1
2
ports:
        - "3306:3306"
Добавлено через 2 часа 29 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
Очевидно, что если запускать что-то не в докере, то никаких докерных имён (database) он не увидит.
До меня дошло. Имя сервера мы оставляем хоста -
localhost
, а порт указываем тот что прокидываем -
3316
.
Это заработало, но это не решает мою проблему, потому что в контейнере то имя сервера будет не
localhost
, а
database
.
Вопрос остается тот же: как быть?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
19.11.2020, 21:19
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Т.е. с хоста в контейнер никак нельзя подключиться?
Запросто можно.

Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
А для чего мы тогда делаем вот эти пробросы портов?
В стэке сетевых технололгий кроме портов есть ещё IP-адреса и доменные имена.

Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Это заработало, но это не решает мою проблему, потому что в контейнере то имя сервера будет не. Вопрос остается тот же: как быть?
Я тебе сказал как быть: конфиги должны пробрасываться извне, а не быть зашиты в приложение.

Впрочем, похоже, ты не хочешь это понимать и делать нормально. Ну добавь строку

Code
1
127.0.0.1 database
в файл hosts. Где он находится в винде, я надеюсь, сам найдёшь.
1
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
20.11.2020, 15:02  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
конфиги должны пробрасываться извне, а не быть зашиты в приложение.
Можете ссылку кинуть где можно прочитать как это делается?

Добавлено через 3 минуты
Цитата Сообщение от korvin_ Посмотреть сообщение
в файл hosts. Где он находится в винде, я надеюсь, сам найдёшь.
Такой себе вариант, придется ведь все сервера на хосте запускать с 'database'
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
21.11.2020, 11:12
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Можете ссылку кинуть где можно прочитать как это делается?
Я не работаю с Tomcat, сам ищи.

Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
придется ведь все сервера на хосте запускать с 'database'
Зачем все?
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
21.11.2020, 21:50  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Я не работаю с Tomcat, сам ищи.
Нашел такой вариант:
Прописываем переменные среды:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
services:
 
  authorizationService:
    image: tomcat  
    volumes:
        - E:\Authorization_service_prjct\war_arсhive:/usr/local/tomcat/webapps
    environment:
        - SPRING_PROFILES_ACTIVE: application-server 
        - SPRING_DATASOURCE_URL: jdbc:mysql://database:3306/db_users?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
        - DB_USER: root
        - DB_PASSWORD: root
    ports:
        - "8888:8080"
    links:
        - "database:db_users"
  
  database:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
        MYSQL_ROOT_USER: root
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: db_users
    ports:
      # <Port exposed> : < MySQL Port running inside container>
      - '3316:3306'
    expose:
      # Opens port 3306 on the container
      - '3306'
Создаем 3 файла properties:
1) тот, что должен грузиться 1-ым и из которого мы берем данные какой файл properties нам нужно будет использовать, в нем же прописываем дефолтный application.properties:
Bash
1
2
spring.config.name=application
spring.profiles.active=${SPRING_PROFILES_ACTIVE:application-local.properties}
2) файл properties с настройками для контейнера application-server.properties:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring.config.name=application-server
spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
 
spring.liquibase.change-log=classpath:liquibase/db.changelog-master.xml
spring.liquibase.url=${SPRING_DATASOURCE_URL}
spring.liquibase.user=${DB_USER}
spring.liquibase.password=${DB_PASSWORD}
2) файл properties с настройками для локального сервера application-local.properties:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring.config.name=application-local
spring.datasource.url=jdbc:mysql://localhost:3306/db_users?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
 
spring.liquibase.change-log=classpath:liquibase/db.changelog-master.xml
spring.liquibase.url=jdbc:mysql://localhost:3306/db_users?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
spring.liquibase.user=root
spring.liquibase.password=root
По идее должно работать следующим образом:
1) грузится файл application.properties
2) по свойству spring.profiles.active определяется какой должен использоваться файл properties, если переменная окружения
SPRING_PROFILES_ACTIVE
не определена, то по дефолту должен использоваться application-local.properties.

Но тест запуска на локалке выдал ошибку с загрузкой Datasourse:
Caused by: org.springframework.boot.autoconfigure.j dbc.DataSourceProperties$DataSourceBeanC reationException: Failed to determine a suitable driver class
at org.springframework.boot.autoconfigure.j dbc.DataSourceProperties.determineDriver ClassName(DataSourceProperties.java:234)
at org.springframework.boot.autoconfigure.j dbc.DataSourceProperties.initializeDataS ourceBuilder(DataSourceProperties.java:1 75)
at org.springframework.boot.autoconfigure.j dbc.DataSourceConfiguration.createDataSo urce(DataSourceConfiguration.java:43)
at org.springframework.boot.autoconfigure.j dbc.DataSourceConfiguration$Hikari.dataS ource(DataSourceConfiguration.java:85)
at java.base/jdk.internal.reflect.NativeMethodAccesso rImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccesso rImpl.invoke(NativeMethodAccessorImpl.ja va:62)
at java.base/jdk.internal.reflect.DelegatingMethodAcc essorImpl.invoke(DelegatingMethodAccesso rImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.j ava:566)
at org.springframework.beans.factory.suppor t.SimpleInstantiationStrategy.instantiat e(SimpleInstantiationStrategy.java:154)
... 88 more
Т.е. это почему-то не работает - загрузка файлов properties идет не как планировалось.

В чем ошибка?
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
07.01.2021, 13:30  [ТС]
ошибка была в том, что нужно прописывать не
XML
1
spring.profiles.active=${SPRING_PROFILES_ACTIVE:application-local.properties}
, а
XML
1
spring.profiles.active=${SPRING_PROFILES_ACTIVE:local}
Добавлено через 17 минут
https://docs.spring.io/spring-... e-specific
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2021, 13:30

Python/django/postgre с docker-compose
Добрый день! Прошу подсказать как праивльно поднимать python/django/postgre с докер композ. Хотелось бы уточнить также следует ли...

Линкование go app контейнера к другому контейнеру с docker-compose
Как прилинковать go app контейнера к другому node.js контейнеру с docker-compose? есть ли пример кода на golang как это можно...

Контейнер с приложением django не подключается к контейнеру postgres (docker-compose)
Здравствуйте. Возникла проблема с разворачиванием проекта на django в docker. Джанговское приложение не хочет подключаться к postgres,...

Как сделать бэкап с одного docker контейнера и развернуть его в другом?
Привет! Есть 2 независимых физически разделенных docker-контейнера с Монгой, к которой есть доступ. Что бы сделать и развернуть бэкап...

Как прописать путь к папке со звуковым файлом в проекте
SoundPlayer sergey = new SoundPlayer(@&quot;C:\SOUND\NAMES\SERGEY.wav&quot;); sergey.Play(); /* Вот именно не путь на диске а в папке в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru