Dockerizing многомодульное приложение Spring Boot с использованием плагина JIB

У меня есть загрузочное приложение Spring и использующий плагин spotify для Dockerize моего приложения. Итак, у меня будет Dockerfile, как показано ниже.

FROM jdk1.8:latest  

RUN mkdir -p /opt/servie

COPY target/service.war /opt/service

ENV JAVA_OPTS="" \
    JAVA_ARGS=""

CMD java ${JAVA_OPTS} -jar /opt/service/service.war ${JAVA_ARGS}

Я столкнулся с JIB, и это выглядит действительно круто. Но, изо всех сил пытаясь заставить это работать.

Я добавил запись о помпе ниже.

<plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>0.9.6</version>
        <configuration>
          <from>
            <image>jdk1.8:latest</image>
          </from>
          <to>
            <image>docker.hub.com/test/service</image>
          </to>
        </configuration>
      </plugin>

mvn compile jib: build

Я вижу следующее.

[INFO] Слой строительных зависимостей... [INFO] Слой строительных классов... [INFO] Слой строительных ресурсов...

Когда я запускаю образ докера, он говорит, что файл JAR не существует. У меня есть многомодульный проект Maven и я хотел бы объединить несколько модулей при запуске mvn compile jib: build из родительского pom. Любая помощь в этом?

3 ответа

Да, в самом деле. JIB не нужен Dockerfile или же dockerd,

Разделяя пример ниже, вы можете просто скопировать его в plugins раздел вашего pom.xml

<plugin>  
    <groupId>com.google.cloud.tools</groupId>  
    <artifactId>jib-maven-plugin</artifactId>  
    <version>0.9.7</version>  
    <configuration>  
    <allowInsecureRegistries>true</allowInsecureRegistries>  
    <from>  
        <image>gcr.io/distroless/java</image>  
    </from>  
    <to>  
    <!-- make sure you already have created a project at Google Cloud Platform, see https://cloud.google.com/container-registry/ -->  
        <image>gcr.io/my-gcp-project/${project.artifactId}:${project.version}</image>  
        <credHelper>gcr</credHelper>  
    </to>  
    <container>  
        <jvmFlags>  
            <jvmFlag>-Xms256m</jvmFlag>  
            <jvmFlag>-Xmx512m</jvmFlag>  
            <jvmFlag>-Xdebug</jvmFlag>  
            <jvmFlag>-XX:+UnlockExperimentalVMOptions</jvmFlag>  
            <jvmFlag>-XX:+UseCGroupMemoryLimitForHeap</jvmFlag>  
        </jvmFlags>  
        <mainClass>learnmake.microservices.RunApplication</mainClass>  
        <ports>  
            <port>8080</port>  
            <!-- <port>4000-4004/udp</port> -->  
        </ports>  
        <format>OCI</format>  
        <!-- OR <format>Docker</format> -->  
        <useCurrentTimestamp>true</useCurrentTimestamp>  
      </container>  
    </configuration>  
</plugin>   

для более подробного примера, см. learnmake-microservices

Jib :build попытается отправить изображение в какое-то репо. Если вам нужно только построить, вам нужно использовать mvn jib:dockerBuild

Для многомодульного проекта просто настройте плагин соответствующим образом в дочерних проектах следующим образом:

<executions>
    <execution>
        <phase>package</phase>
            <goals>
                <goal>dockerBuild</goal>
            </goals>
        </execution>
</executions>

Используя плагин jib maven, вам не нужно писать файл docker, jib создаст для вас образ напрямую, не раскрывая файл docker.

Я думаю, что в вашем pom.xml переключение упаковки с "войны" на "банку"

будет достаточно, чтобы вы могли успешно работать

mvn compile jib:build

(произойдет сбой, если docker.hub.com/test/service является частным хранилищем, в этом случае вам нужно либо перейти к общедоступному, либо предоставить свои учетные данные)

Попробуйте изменить строку COPY в вашем Dockerfile на

COPY target/service.war /opt/service/service.war

Кстати, вы можете использовать директиву WORKDIR в вашем Dockerfile, чтобы использовать относительный путь

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