Теперь это работает, и я могу остановить его и попытаться перезагрузить его с новыми командами. Я не хочу удалять изображение, которое у меня есть, и я не хочу избавляться от контейнера, который у меня есть. У него есть несколько баз данных для личных проектов и некоторые данные, которые я хочу. Я бы не хотел сделать резервное копирование нескольких баз данных, хотя я мог бы, если бы мне придется, я просто предпочитаю этого не делать. Эта база данных (MySQL) была настроена на порту 3306.src/main/resources/application.properties
spring.datasource.url=jdbc:mysql://mysql-db:3306/my_db?serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=myuser
spring.datasource.password=password
< /code>
В «url» значение «mysql-db»-это имя контейнера, так как я вижу, что это не может быть «локально». Я понимаю, что каждый контейнер Docker - это собственная виртуальная машина, и Localhost не будет работать, поэтому я понимаю. Теперь Springboot строит нормально, потому что я скопировал файл приложения.src/test/resources/application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/my_db?serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=myuser
spring.datasource.password=password
< /code>
Из -за этого все мои тесты на Junit по базе данных работают отлично. Теперь проблема возникает, когда я строю, развертываю и изображает в новом контейнере Docker. Я хочу использовать существующий контейнер, и мне нужно выяснить, как это сделать, и это то, что я искал. Итак, позвольте мне начать с показа Dockerfile, и вы можете сказать мне, если что -то не так: < /p>
FROM openjdk:23
ARG JAR_FILE=target/*.jar
COPY ./target/htmx-demo-0.0.1-SNAPSHOT.jar htmx-demo-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","htmx-demo-0.0.1-SNAPSHOT.jar"]
< /code>
У меня нет команды запуска, потому что у нее были проблемы, поэтому я удалил ее. Я не знаю, нужен ли мне это, но сейчас это работает. Пожалуйста, дайте мне знать, если есть что -нибудь еще нужно. Далее следует файл compose.yml, который я использую, и позвольте мне разместить его здесь. < /P>
services:
mysql:
container_name: mysql-db /* already exists */
image: mysql
environment:
MYSQL_DATABASE: phonebook_db
MYSQL_USER: operator
MYSQL_PASSWORD: passw0rd
MYSQL_ROOT_PASSWORD: passw0rd
ports:
- "3306:3306"
volumes:
- ./sql:/docker-entrypoint-initdb.d
networks:
- my_network
htmx-demo-app:
build: .
ports:
- "8080:80"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql-db:3306/phonebook_db?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&createDatabaseIfNotExist=true
SPRING_DATASOURCE_USERNAME: operator
networks:
- my_network
networks:
my_network:
driver: bridge
< /code>
Итак, позвольте мне распаковать этот файл compose.yml: < /p>
- Я понимаю, что compose.yml - это оркестровая. Если приложению нужно сначала запустить, то сначала эти вещи настроены. Итак, первая служба - база данных MySQL. Мне это не нужно, чтобы создать новый контейнер для MySQL, когда он уже существует. Я уже знаю, что база данных работает, без сомнения. Я могу подключиться к нему с помощью Workbench. Я предположил, что если бы существовал контейнер, он сказал бы, он уже существует, а не создаст новый контейнер. Как это так, когда я запускаю команду Spring Boot Run, то я получаю сообщение об ошибке, что контейнер уже существует. У них была база данных MySQL, загруженная с помощью данных, и она была в собственном контейнере, когда вы посмотрели на файл compose.yml, MySQL не был в файле compose.yml, поэтому он не будет пытаться создать новый. Это то, что я, вероятно, исправим. Порты правы, и мы используем сеть. Я предполагаю, что если этой сети не существует, то она создается. Поскольку я читал другие ответы, было сказано, что у Docker уже есть сеть «по умолчанию», и если все контейнеры находятся на одной физической машине, как и у меня, то я подумал, что это решает проблему. Опять же, «MySQL-DB»-это имя контейнера, а не «LocalHost». Однако, когда изображение для приложения создается и развернуто в Docker, мы обнаруживаем, что абсолютно не можем найти MySQL-DB, так что я не знаю, почему? Это очень фрагментарное. Я предполагаю, что это создает сеть, если ее не существует, и, конечно, приложение помещается в эту сеть. Я не знаю, нужно ли это сделать, потому что все эти контейнеры находятся на одной машине (мой физический ноутбук), и поэтому я читаю, что должна быть сеть по умолчанию, где уже есть сеть по умолчанию. Дорога, у меня есть контейнер Kafka, и я хочу, чтобы мое приложение для Spring Boot в контейнере поговорило с этой кафкой также в контейнере Docker.
Когда я развернут передний конец (React /Angular) в свой собственный контейнер, они будут разработаны позже, и задняя часть не будет зависеть от этого. Я не хочу, чтобы фронт-энд полагался на задний план. В этой непрофильной среде я возьму на себя ответственность за то, чтобы услуги работали в первую очередь, прежде чем я начну фронт-энды, если в производственной среде или базе данных не работают. Кафка должен быть запущен следующим - Тогда заднее время может запустить, так как Kafka и DB начинаются
- Тогда передний конец может работать, потому что заполняется заднее время
Подробнее здесь: https://stackoverflow.com/questions/794 ... another-co