«1. Обзор

В этом руководстве мы рассмотрим Jib и то, как он упрощает контейнеризацию Java-приложений.

Мы возьмем простое приложение Spring Boot и создадим его образ Docker с помощью Jib. Затем мы также опубликуем образ в удаленном реестре.

И не забудьте также обратиться к нашему руководству по докеризации приложений Spring Boot с помощью dockerfile и инструмента docker.

2. Введение в Jib

Jib — это инструмент Java с открытым исходным кодом, поддерживаемый Google для создания образов Docker приложений Java. Это упрощает контейнеризацию, поскольку с ним нам не нужно писать файл докеров.

И на самом деле нам даже не нужно устанавливать докер, чтобы самим создавать и публиковать образы докеров.

Google публикует Jib как плагин для Maven и Gradle. Это хорошо, потому что это означает, что Jib будет ловить любые изменения, которые мы вносим в наше приложение при каждой сборке. Это избавляет нас от отдельных команд docker build/push и упрощает добавление этого в конвейер CI.

Существует также несколько других инструментов, таких как плагины Spotify docker-maven-plugin и dockerfile-maven, хотя первый сейчас устарел, а для второго требуется файл dockerfile.

3. Простое приветственное приложение

Давайте возьмем простое приложение с весенней загрузкой и докеризуем его с помощью Jib. Он предоставит простую конечную точку GET:

http://localhost:8080/greeting

Что мы можем сделать очень просто с контроллером Spring MVC:

@RestController
public class GreetingController {

    private static final String template = "Hello Docker, %s!";
    private final AtomicLong counter = new AtomicLong();

    @GetMapping("/greeting")
    public Greeting greeting(@RequestParam(value="name", 
        defaultValue="World") String name) {
        
        return new Greeting(counter.incrementAndGet(),
          String.format(template, name));
    }
}

4. Подготовка к развертыванию

Нам также нужно настроить себя локально для аутентификации в репозитории Docker, в который мы хотим выполнить развертывание.

В этом примере мы предоставим наши учетные данные DockerHub в .m2/settings.xml:

<servers>
    <server>
        <id>registry.hub.docker.com</id>
        <username><DockerHub Username></username>
        <password><DockerHub Password></password>
    </server>
</servers>

Существуют и другие способы предоставления учетных данных. Google рекомендует использовать вспомогательные инструменты, которые могут хранить учетные данные в зашифрованном формате в файловой системе. В этом примере мы могли бы использовать docker-credential-helpers вместо хранения учетных данных в виде простого текста в settings.xml, что намного безопаснее, хотя просто не рассматривается в этом руководстве.

5. Развертывание в Docker Hub с помощью Jib

Теперь мы можем использовать jib-maven-plugin или эквивалент Gradle для контейнеризации нашего приложения с помощью простой команды:

mvn compile com.google.cloud.tools:jib-maven-plugin:2.5.0:build -Dimage=$IMAGE_PATH

где IMAGE_PATH является целью путь в реестре контейнеров.

Например, чтобы загрузить образ baeldungjib/spring-jib-app в DockerHub, мы должны сделать:

export IMAGE_PATH=registry.hub.docker.com/baeldungjib/spring-jib-app

Вот и все! Это создаст Docker-образ нашего приложения и отправит его в DockerHub.

Мы можем, конечно, аналогичным образом загрузить образ в Google Container Registry или Amazon Elastic Container Registry.

6. Упрощение команды Maven

Кроме того, мы можем сократить нашу начальную команду, вместо этого настроив плагин в нашем pom, как и любой другой плагин maven.

<project>
    ...
    <build>
        <plugins>
            ...
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>2.5.0</version>
                <configuration>
                    <to>
                        <image>${image.path}</image>
                    </to>
                </configuration>
            </plugin>
            ...
        </plugins>
    </build>
    ...
</project>

С этим изменением мы можем упростить нашу команду maven:

mvn compile jib:build

7. Настройка аспектов Docker

По умолчанию Jib делает ряд разумных предположений о том, что мы хотим, например FROM и ВХОД.

Давайте внесем в наше приложение пару изменений, более подходящих для наших нужд.

Во-первых, Spring Boot по умолчанию предоставляет порт 8080.

Но, скажем, мы хотим, чтобы наше приложение работало на порту 8082 и сделало его доступным через контейнер.

Разумеется, мы внесем соответствующие изменения в Boot. И после этого мы можем использовать Jib, чтобы сделать его видимым на изображении:

<configuration>
    ...
    <container>
        <ports>
            <port>8082</port>
        </ports>
    </container>
</configuration>

Или, скажем, нам нужен другой FROM. По умолчанию Jib использует образ Java без дистрибутива.

Если мы хотим запустить наше приложение на другом базовом образе, таком как alpine-java, мы можем настроить его аналогичным образом:

<configuration>
    ...
    <from>                           
        <image>openjdk:alpine</image>
    </from>
    ...
</configuration>

Мы настраиваем теги, тома и несколько других директив Docker в том же способ.

8. Настройка аспектов Java

Кроме того, Jib также поддерживает множество конфигураций времени выполнения Java:

    jvmFlags указывает, какие флаги запуска передавать JVM. mainClass предназначен для указания основного класса, который Jib попытается вывести автоматически по умолчанию. args — это место, где мы указываем аргументы программы, передаваемые основному методу.

«Конечно, обязательно ознакомьтесь с документацией Jib, чтобы увидеть все доступные свойства конфигурации.

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

В этом руководстве мы увидели, как создавать и публиковать образы докеров с помощью Google Jib, в том числе как получить доступ к директивам докеров и конфигурациям среды выполнения Java через Maven.

Как всегда, исходный код этого примера доступен на Github.