Используйте Docker для приложения Spring Boot REST - PullRequest
0 голосов
/ 12 февраля 2019

Я хотел бы иметь базовую настройку для запуска приложения Spring Boot + MySQL REST с Docker.Приложение работает само по себе (без Docker).Структура проекта предоставлена,

enter image description here

Это предоставленный файл pom.xml.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.appoint.manager</groupId>
    <artifactId>Appointment</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Appointment</name>
    <description>A project for Appointment Management</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>


    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.github.javafaker/javafaker -->
        <dependency>
            <groupId>com.github.javafaker</groupId>
            <artifactId>javafaker</artifactId>
            <version>0.17.2</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/com.jayway.jsonpath/json-path -->
        <dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <version>2.4.0</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.8</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.assertj/assertj-core -->
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.11.1</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.24.0</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.4.RELEASE</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-library -->
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-all</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.3.2</version>
            <scope>test</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-library -->
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>2.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>



    <build>
        <defaultGoal>install</defaultGoal>
        <!--<sourceDirectory>src</sourceDirectory>-->

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.5</version>
                <configuration>
                    <imageName>springdocker</imageName>
                    <baseImage>java</baseImage>
                    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>


        </plugins>
    </build>

</project>

Используемый Dockerfile, который я использую,

FROM java:8
VOLUME /tmp
ADD /target/Appointment-0.0.1-SNAPSHOT.jar Appointment.jar
RUN bash -c 'touch /Appointment.jar'
ENTRYPOINT ["java","-jar","/Appointment.jar"]

Это файл docker-compose.yaml для проекта

version: '3'

services:
  web:
    build: .
    ports:
    - "8080:8080"
    volumes:
    - .:/code
    - logvolume01:/var/log

  appointment-mysql:
      container_name: appointment-mysql
      image: mysql/mysql-server:5.7
      environment:
        MYSQL_DATABASE: Appointment
        MYSQL_ROOT_PASSWORD: testpassword
        MYSQL_ROOT_HOST: '%'
      ports:
      - "3307:3307"
      restart: always

volumes:
  logvolume01: {}

Выполнены следующие шаги длязапустите приложение через Docker,

  1. $ mvn clean package Это создаст Appointment-0.0.1-SNAPSHOT.jar в каталоге / target.

  2. Наконец, я запускаю команду $ docker-compose up Я получаю сообщение об ошибке [ERROR] No goals have been specified for this build..Предоставляется полный стек ошибок:

      $ docker-compose up 
    

    appointment-mysql is up-to-date Starting appointmentmanager_web_1 ... done Attaching to appointment-mysql, appointmentmanager_web_1 appointment-mysql | [Entrypoint] MySQL Docker Image 5.7.25-1.1.10 appointment-mysql | [Entrypoint] Starting MySQL 5.7.25-1.1.10 appointment-mysql | [Entrypoint] MySQL Docker Image 5.7.25-1.1.10 appointment-mysql | [Entrypoint] Starting MySQL 5.7.25-1.1.10 appointment-mysql | [Entrypoint] MySQL Docker Image 5.7.25-1.1.10 appointment-mysql | [Entrypoint] Starting MySQL 5.7.25-1.1.10 appointment-mysql | [Entrypoint] MySQL Docker Image 5.7.25-1.1.10 appointment-mysql | [Entrypoint] Starting MySQL 5.7.25-1.1.10 web_1 | [INFO] Scanning for projects... web_1 | [INFO] ------------------------------------------------------------------------ web_1 | [INFO] BUILD FAILURE web_1 | [INFO] ------------------------------------------------------------------------ web_1 | [INFO] Total time: 0.186 s web_1 | [INFO] Finished at: 2019-02-12T19:17:03Z web_1 | [INFO] ------------------------------------------------------------------------ web_1 | [ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1] web_1 | [ERROR] web_1 | [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. web_1 | [ERROR] Re-run Maven using the -X switch to enable full debug logging. web_1 | [ERROR] web_1 | [ERROR] For more information about the errors and possible solutions, please read the following articles: web_1 | [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoGoalSpecifiedException appointmentmanager_web_1 exited with code 1

Это интересно, поскольку я определил цель в файле pom.xml, определенном здесь,

 <build>
        <defaultGoal>install</defaultGoal>
        <sourceDirectory>src</sourceDirectory>
<build>

В чем здесь проблема и как правильно запустить приложение через Docker?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вместо того, чтобы использовать maven для запуска docker-compose, которая запускает приложение, попробуйте что-то вроде

docker run --rm -v "$HOME/.m2":/root/.m2 -v "$PWD/":/opt/maven -w=/opt/maven maven:3-jdk-11 mvn clean run или какую-то другую версию с помощью docker-compose

0 голосов
/ 20 февраля 2019

Здесь я вижу три возможных решения:

1. Самый простой способ - создать образ после создания банки:

docker build -t yourapp

И затем в docker-compose вместоbuild, который вы должны поместить:

image: yourapp

См. следующий параметр для получения более подробной информации.

2. Ваша конфигурация похожа на эта в Gradle .Он использует gradle для создания образа, как вы включили в ваш пример maven, а затем он использует образ docker внутри docker-compose.Я не проверял себя, но это должно быть что-то вроде этого:

mvn clean package docker:build

Докер должен составить (помните, что имеет значение ):

services:
  web:
    container_name: web
    image: springdocker
    ports:
      - "8080:8080"
    depends_on:
      - appointment-mysql
    volumes:
      - .:/code
      - logvolume01:/var/log
    restart: always

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

3. Второй пример взят из здесь .В этом случае вы можете построить изображение.Плагин maven для создания образа докера удален.Часть сборки остается такой же, как

    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>

Компонент docker compose выглядит примерно так:

services:
  web:
    container_name: web
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - appointment-mysql
    volumes:
      - .:/code
      - logvolume01:/var/log
    command: mvn clean spring-boot:run 
    restart: always

В этом примере важная вещь - это командная часть.Dockerfile следует изменить следующим образом (в образе java не установлен maven):

FROM maven:3.5-jdk-8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...