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, чтобы использовать относительный путь