Как настроить pom.xml для Maven / SpringBoot Project для докера? - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь докернизировать мое приложение SpringMVC через Maven. Мое намерение состоит в том, чтобы получить изображение, которое я затем смогу открыть для показа и отображения через веб-браузер.

К сожалению, следуя этому руководству , мне, похоже, все еще не хватает критического понимания относительно изменений pom.xml, которые я должен сделать, чтобы добиться этого, и Dockerfile.

======

Вот файл Docker:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

======

Вот pom.xml исходного кода в его последней редакции.

======

Вот моя последняя попытка пересмотра, следуя примеру pom.xml руководства SpringIO, на которое я ссылался выше (раздел зависимостей не включен).

<modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.davidonus</groupId>
    <artifactId>davidonusSpringDemo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!-- tag::packaging[] -->
    <packaging>jar</packaging>
    <name>davidonusSpringDemo1</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <!-- tag::docker[] -->
        <docker.image.prefix>springio</docker.image.prefix>
    </properties>

    <profiles>
        <profile>
            <id>DavidSpringTime</id>
        </profile>
    </profiles>


    <build>


        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- tag::plugin[] -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.9</version>
                <configuration>
                    <repository>${docker.image.prefix}/${project.artifactId}</repository>
                </configuration>
            </plugin>
            <!-- end::plugin[] -->

            <!-- tag::unpack[] -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unpack</id>
                        <phase>package</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>${project.groupId}</groupId>
                                    <artifactId>${project.artifactId}</artifactId>
                                    <version>${project.version}</version>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- end::unpack[] -->
        </plugins>
    </build>

Вот мои нынешние результаты, используя команду mvn install build:docker

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  12.050 s
[INFO] Finished at: 2019-06-15T13:24:01-04:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:3.1.1:unpack (unpack) on project davidonusSpringDemo1: Unable to update Marker timestamp: /home/david/Desktop/DevOps2019/springBoot/teluskoSpringBoot/target/dependency-maven-plugin-markers/com.davidonus-davidonusSpringDemo1-jar-0.0.1-SNAPSHOT.marker: Unable to update last modified timestamp on marker file /home/david/Desktop/DevOps2019/springBoot/teluskoSpringBoot/target/dependency-maven-plugin-markers/com.davidonus-davidonusSpringDemo1-jar-0.0.1-SNAPSHOT.marker -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

======

В итоге, с учетом моего исходного pom.xml , , какие изменения вы бы внесли , чтобы сделать мой проект SpringBoot + Maven развертываемым как образ докера и контейнер?

Кроме того, есть ли у вас какие-либо изменения в моем Dockerfile? Ваша консультация приветствуется. Спасибо.

Ответы [ 2 ]

2 голосов
/ 16 июня 2019

Если у вас есть готовый код Springboot с pom.xml. Затем выполните приведенные ниже шаги для контейнеризации вашего приложения.

  • git clone https://github.com/dnmorris7/teluskoSpringBoot (я клонирую твой код весенней загрузки)
  • git checkout module5 (проверенная ветка module5)
  • Создан Dockerfile в вашей кодовой базе git со следующим содержимым:
FROM maven:3.6-jdk-8-slim AS build
COPY . /usr/src/app/
WORKDIR /usr/src/app/
RUN mvn -f /usr/src/app/pom.xml clean package

FROM java:8-alpine
WORKDIR /
COPY --from=build /usr/src/app/target/*.jar /app.jar
CMD java -jar app.jar

ПРИМЕЧАНИЕ: Я использую многоэтапную сборку docker, где в первом stsage maven собирает банку, а на втором этапе мы копируем эту банку в образе java.

  • Теперь создайте свой образ докера docker build -t appimage:v1 .
  • Запустите ваш док-контейнер docker run -it -d -p 9090:9090 appimage:v1
  • Нажмите API, чтобы убедиться, что он работает нормально.
$ curl localhost:9090/home
{"timestamp":"2019-06-16T05:34:26.655+0000","status":404,"error":"Not Found","message":"/pages/home.jsp","path":"/home"}

Пожалуйста, введите правильный базовый URL, я пытался с /home

ПРИМЕЧАНИЕ: Если вы хотите указать свой собственный application.properties, измените команду java -jar в Dockerfile на CMD java -jar app.jar --spring.config.additional-location=application.properties и измените команду запуска докера на docker run -it -d -v application.properties:/application.properties -p 9090:9090 appimage:v1, где application.properties это тот, который вы предоставляете извне.

0 голосов
/ 15 июня 2019

Я думаю, что не так много не хватает.Или, что еще лучше, может быть даже слишком много вещей.

Во-первых, вы должны указать плагину docker maven работать.Жизненный цикл maven определяет, какие плагины работают на какой фазе.Таким образом, все остальные плагины нуждаются где-то в конфигурации исполнения (в родительском или в вашем).Во-вторых, нет необходимости распаковывать созданный файл jar.Spring Boot автоматически создаст исполняемый файл JAR.Вам нужно только сообщить о нем плагину Docker Maven (где он был создан)

Это будет Dockerfile:

FROM openjdk:8-jdk-alpine
VOLUME /tmp

ARG JAR_FILE

ADD target/${JAR_FILE} /usr/share/myapp.jar

ENTRYPOINT ["java","-jar","/usr/share/myapp.jar"]

А это ваш pom:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-spring-boot-docker</artifactId>
    <version>0.1.0</version>
    <packaging>jar</packaging>
    <name>Spring Boot Docker</name>
    <description>Getting started with Spring Boot and Docker</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath />
    </parent>

    <properties>
        <docker.image.prefix>springio</docker.image.prefix>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- tag::plugin[] -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.9</version>
                <executions>
                    <execution>
                        <id>default</id>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <repository>${docker.image.prefix}/${project.artifactId}</repository>
                    <buildArgs>
                        <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>
            <!-- end::plugin[] -->
        </plugins>
    </build>

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

</project>

Цель распаковки подключаемого модуля зависимости может быть удалена.Таким образом баночка добавляется в изображение и запускается напрямую.Надеюсь, что это работает!

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