Докер-контейнер Springboot не подключается к контейнеру MySQL, который создается вместе с ним в Docker Compose

Я пытаюсь создать образ докера с приложением Springboot и базой данных MySQL, но не могу подключиться к нему из контейнера Springboot.

Сначала я думал, что контейнер Springboot завершил работу после того, как не смог подключиться к базе данных из-за того, что его запуск занял некоторое время, но я создал сценарий .sh, чтобы контейнер Springboot не запускался до инициализации базы данных, но даже с .sh мне не удалось подключиться к моей базе данных.

В docker-compose я также попытался удалить весь код, связанный с сетью, так как думал, что мне не нужно указывать сеть, если я собираю их вместе таким образом, но, похоже, это не имеет никакого эффекта. Ниже вы можете найти мой Dockerfile, мой docker-compose, свойства приложения Springboot и небольшой скрипт .sh, а также журналы из контейнеров, любая помощь будет очень признательна!

Докерфайл

FROM maven:3.8.1-openjdk-11 AS build

WORKDIR /app

COPY pom.xml .
COPY src ./src

RUN mvn clean package -DskipTests

FROM openjdk:11-jre-slim

RUN apt-get update && apt-get install -y default-mysql-client && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY wait-for-it.sh .

RUN chmod +x wait-for-it.sh

COPY --from=build /app/target/Spring-MyParcial-MVC-DataJPA-Yamid-Punto3-0.0.1-SNAPSHOT.jar .

CMD ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "Spring-MyParcial-MVC-DataJPA-Yamid-Punto3-0.0.1-SNAPSHOT.jar"]

docker-compose.yml

services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      db:
        condition: service_healthy
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/test
      SPRING_DATASOURCE_USERNAME: qwerty
      SPRING_DATASOURCE_PASSWORD: qwerty
      SPRING_JPA_HIBERNATE_DDL_AUTO: update
    networks:
      - app-network

  db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: test
      MYSQL_ROOT_PASSWORD: qwerty
      MYSQL_USER: qwerty
      MYSQL_PASSWORD: qwerty
    ports:
      - "3306:3306"
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 10s
      retries: 10

networks:
  app-network:
    driver: bridge

application.properties

# Database connection settings
spring.datasource.url=jdbc:mysql://db:3306/test
spring.datasource.username=qwerty
spring.datasource.password=qwerty
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

подожди-for-it.sh

#!/bin/bash
# wait-for-it.sh

host = "$1"
shift
cmd = "$@"

until mysqladmin ping -h "$host" --silent; do
  >&2 echo "MySQL is unavailable - sleeping"
  sleep 1
done

>&2 echo "MySQL is up - executing command"
exec $cmd

последние журналы Springboot-db-1

2024-06-02 18:23:02 2024-06-02T23:23:02.745554Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
2024-06-02 18:23:02 2024-06-02T23:23:02.745716Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.37'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server - GPL.
2024-06-02 18:23:03 Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
2024-06-02 18:23:03 Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
2024-06-02 18:23:03 Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
2024-06-02 18:23:05 Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
2024-06-02 18:23:05 Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
2024-06-02 18:23:05 Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
2024-06-02 18:23:06 2024-06-02T23:23:06.050472Z 13 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.37).
2024-06-02 18:23:08 2024-06-02T23:23:08.086402Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.37)  MySQL Community Server - GPL.
2024-06-02 18:23:09 2024-06-02T23:23:09.284886Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
2024-06-02 18:23:09 2024-06-02T23:23:09.286715Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.37) starting as process 1
2024-06-02 18:23:09 2024-06-02T23:23:09.294392Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-06-02 18:23:09 2024-06-02T23:23:09.474764Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-06-02 18:23:09 2024-06-02T23:23:09.769065Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2024-06-02 18:23:09 2024-06-02T23:23:09.769133Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2024-06-02 18:23:09 2024-06-02T23:23:09.778336Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2024-06-02 18:23:09 2024-06-02T23:23:09.810279Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2024-06-02 18:23:09 2024-06-02T23:23:09.810419Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.37'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.

Springboot-app-1 регистрирует, он никогда не останавливается, так как никогда не подключается

2024-06-02 18:24:11 MySQL is unavailable - sleeping
2024-06-02 18:24:12 MySQL is unavailable - sleeping
2024-06-02 18:24:13 MySQL is unavailable - sleeping
2024-06-02 18:24:14 MySQL is unavailable - sleeping
Пожалуйста, не загружайте изображения кода/данных/ошибок. Можете ли вы отредактировать вопрос, включив в него фактические журналы контейнера, а не снимок экрана? Похоже, у вас есть только журналы базы данных; у вас есть логи из контейнера приложения?
David Maze 03.06.2024 01:00

@DavidMaze Добавил сами журналы в виде текста, журнал из приложения представляет собой бесконечный цикл из моего .sh-скрипта, я мог бы удалить его, чтобы показать журналы из самого контейнера, но, похоже, это в основном проблема с подключением, но я добавлю их, если это так. мог бы помочь

sappho7124 03.06.2024 01:33
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

mysqladmin принимает хост и порт с разными параметрами, поэтому использование -h "db:3306" не будет работать корректно.

Вместо этого вы можете сделать это следующим образом (обратите внимание на верхний регистр -P):

mysqladmin ping -h db -P 3306 --silent

или поскольку 3306 стоит по умолчанию, этого достаточно:

mysqladmin ping -h db --silent

Поэтому самым быстрым решением для вашего образа Docker было бы изменить CMD на это:

CMD ["./wait-for-it.sh", "db", "--", "java", "-jar", "Spring-MyParcial-MVC-DataJPA-Yamid-Punto3-0.0.1-SNAPSHOT.jar"]

Другие вопросы по теме