Рубрики
Без рубрики

Запуск Spring Boot с PostgreSQL в Docker Compose

Быстрое и практичное руководство по запуску Spring boot с PostgreSQL в Docker Compose.

Автор оригинала: Karsten Silz.

1. Введение

В этом учебнике мы хотим запустить приложение Spring Boot с популярной базой данных с открытым исходным кодом PostgreSQL. В предыдущем статья мы смотрели на Докер Сочинять для обработки нескольких контейнеров одновременно . Таким образом, вместо установки PostgreSQL в качестве отдельного приложения, Мы будем использовать Docker Compose для запуска весенней загрузки и PostgreSQL .

2. Создание проекта «Весенняя загрузка»

Пойдем в Весенний инициализатор и создать наш проект Весенняя загрузка . Мы добавим PostgreSQL driver и Spring Data JPA Модули. После загрузки полученного файла и извлечения его в папку, мы можем запустить наше новое приложение:

./mvnw spring-boot:run

Приложение выходит из строя, поскольку не может подключиться к базе данных:

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

3. DockerFile

Прежде чем мы сможем начать PostgreSQL с Docker Compose, мы должны превратить наше приложение Spring Boot в изображение Docker . Первым шагом является пакет приложения в качестве файла JAR:

./mvnw clean package -DskipTests

Здесь мы сначала очищаем наши предыдущие сборки перед упаковкой приложения. Кроме того, мы пропускаем тесты, потому что они терпят неудачу без PostgreSQL.

Теперь у нас есть приложение JAR файл в целевые каталог. Этот файл имеет название проекта и номер версии в его названии и заканчивается -СНИМОК.JAR . Так что его название может быть докер-весна-загрузка-postgres-0.0.1-SNAPSHOT.jar .

Давайте делать новые src/main/docker каталог. После этого мы копим приложение JAR файл там:

cp target/docker-spring-boot-postgres-0.0.1-SNAPSHOT.jar src/main/docker

Наконец, мы создаем эту DockerFile в том же каталоге:

FROM adoptopenjdk:11-jre-hotspot
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} application.jar
ENTRYPOINT ["java", "-jar", "application.jar"]

Этот файл описывает, как Docker должен запускать наше приложение Spring Boot . Он использует Java 11 из ПринятьOpenJDK и копирует файл приложения JAR для применение.jar . Затем он запускает этот файл JAR, чтобы начать наше приложение Spring Boot.

4. Docker Compose файл

Теперь давайте напишем наш файл Docker Compose, docker-compose.yml , и сохранить его в src/main/docker :

version: '2'

services:
  app:
    image: 'docker-spring-boot-postgres:latest'
    build:
      context: .
    container_name: app
    depends_on:
      - db
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/compose-postgres
      - SPRING_DATASOURCE_USERNAME=compose-postgres
      - SPRING_DATASOURCE_PASSWORD=compose-postgres
      - SPRING_JPA_HIBERNATE_DDL_AUTO=update
          
  db:
    image: 'postgres:13.1-alpine'
    container_name: db
    environment:
      - POSTGRES_USER=compose-postgres
      - POSTGRES_PASSWORD=compose-postgres

Название нашего приложения – приложение. Это первый из двух сервисов (линии 4-15):

  • Spring boot Docker изображение имеет название docker-spring-boot-postgres:последний (линия 5). Докер строит это изображение из Доккерфил в текущем каталоге (линии 6-7)
  • Название контейнера приложение (линия 8). Это зависит от DB обслуживание (линия 10). Вот почему она начинается после DB контейнер
  • Наше приложение использует DB Контейнер PostgreSQL в качестве источника данных (линия 12). Имя базы данных, имя пользователя и пароль составной постгрес (линии 12-14)
  • Hibernate будет автоматически создавать или обновлять любые таблицы баз данных, необходимые (строка 15)

База данных PostgreSQL имеет название DB и является вторым сервисным (линии 17-22):

  • Мы используем PostgreS’L 13.1 (линия 18)
  • Название контейнера DB (линия 19)
  • Имя пользователя и пароль являются составной постгрес (линии 21-22)

5. Запуск с Docker Compose

Давайте забудем наше приложение Весенняя загрузка и PostgreSQL с Docker Compose :

docker-compose up

Во-первых, это позволит создать Docker Image для нашего приложения Spring Boot. Далее, он запустит контейнер PostgreSQL. Наконец, он запустит наше приложение Docker изображения. На этот раз наше приложение работает нормально:

Starting DemoApplication v0.0.1-SNAPSHOT using Java 11.0.9 on f94e79a2c9fc with PID 1 (/application.jar started by root in /)
[...]
Finished Spring Data repository scanning in 28 ms. Found 0 JPA repository interfaces.
[...]
Started DemoApplication in 4.751 seconds (JVM running for 6.512)

Как мы видим, Spring Data не нашла интерфейса репозитория. Это правильно – мы еще не создали!

Если мы хотим, чтобы остановить все контейнеры, мы должны нажать на “Ctrl-C” в первую очередь. Тогда мы можем остановить Docker Compose:

docker-compose down

6. Создание сущности клиента и репозитория

Чтобы использовать базу данных PostgreSQL в нашем приложении, Мы создадим простую клиентскую сущность :

@Entity
@Table(name = "customer")
public class Customer {

    @Id
    @GeneratedValue
    private long id;
    
    @Column(name = "first_name", nullable = false)
    private String firstName;
    
    @Column(name = "last_name", nullable = false)
    private String lastName;

Клиентская имеет генерируемую id атрибут и два обязательных атрибута: первоеимя и последнееимя .

Теперь, мы можем написать интерфейс репозитория для этой сущности :

public interface CustomerRepository extends JpaRepository { }

Просто расширяя JpaRepository , мы наследуем методы создания и запроса наших Клиентская сущность.

Наконец, мы будем использовать эти методы в нашем приложении:

@SpringBootApplication
public class DemoApplication {
    @Autowired 
    private CustomerRepository repository; 
  
    @EventListener(ApplicationReadyEvent.class)
    public void runAfterStartup() {
        List allCustomers = this.repository.findAll(); 
        logger.info("Number of customers: " + allCustomers.size());
 
        Customer newCustomer = new Customer(); 
        newCustomer.setFirstName("John"); 
        newCustomer.setLastName("Doe"); 
        logger.info("Saving new customer..."); 
        this.repository.save(newCustomer); 
 
        allCustomers = this.repository.findAll(); 
        logger.info("Number of customers: " + allCustomers.size());
    }
}
  • Мы доступ к нашим Клиентская репозиторий через инъекцию зависимости
  • Мы запрашиваем количество существующих клиентов с репозиторием – это будет ноль
  • Затем мы создаем и спасаем клиента
  • Когда мы снова запросим существующих клиентов, мы ожидаем найти того, кого мы только что создали

7. Запуск с докером Сочинять снова

Чтобы запустить обновленное приложение Spring Boot, нам нужно восстановить его первый. Поэтому мы выполняем эти команды еще раз в корневом каталоге проекта:

./mvnw clean package -DskipTests
cp target/docker-spring-boot-postgres-0.0.1-SNAPSHOT.jar src/main/docker

Как восстановить изображение Docker с помощью обновленного файла JAR приложения? Лучший способ заключается в удалении существующего изображения Docker, имя которого мы указали в докер-compose.yml . Это заставляет Docker создать изображение снова в следующий раз, когда мы начнем наш файл Docker Compose:

cd src/main/docker
docker-compose down
docker rmi docker-spring-boot-postgres:latest
docker-compose up

Таким образом, после остановки наших контейнеров, мы удаляем приложение Docker изображения. Затем мы снова запускаем файл Docker Compose, который восстанавливает изображение приложения.

Вот выход приложения:

Finished Spring Data repository scanning in 180 ms. Found 1 JPA repository interfaces.
[...]
Number of customers: 0
Saving new customer...
Number of customers: 1

Spring Boot находит наш пустой репозиторий клиентов. Таким образом, мы начинаем без клиента, но затем успешно создать один.

8. Заключение

В этом коротком учебнике мы начали с создания приложения Spring Boot для PostgreSQL. Затем мы написали файл Docker Compose для запуска контейнера с приложением с контейнером PostgreSQL.

Наконец, мы создали объект клиента и репозиторий, что позволило нам сохранить клиента в PostgreSQL.

Как обычно, исходный код для этого учебника можно найти более на GitHub .