7.3.9.3. Плагин Gradle для Docker

В этом разделе на примере монолитной конфигурации Uber JAR показано как с помощью плагина Gradle для Docker создать и опубликовать образ приложения CUBA.

Для сборки образа Docker из Gradle можно использовать плагин: bmuschko/gradle-docker-plugin.

Для использования плагина в файл build.gradle нужно добавить зависимости и импортировать необходимые классы для работы с образами как показано в примере (X.Y.Z нужно заменить на актуальную версию плагина):

buildscript {

    dependencies {
        classpath 'com.bmuschko:gradle-docker-plugin:X.Y.Z'
    }
}

import com.bmuschko.gradle.docker.tasks.image.Dockerfile
import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
import com.bmuschko.gradle.docker.tasks.image.DockerPushImage
import com.bmuschko.gradle.docker.DockerRegistryCredentials

Плагин com.bmuschko.docker-remote-api дает возможность взаимодействовать с Docker при помощи удаленного API. Можно смоделировать любой рабочий процесс, создав свою задач на основе пользовательской задачи, предоставляемой плагином. Для того, чтобы воспользоваться плагином, добавьте следующий фрагмент кода в файл build.gradle:

apply plugin: 'com.bmuschko.docker-remote-api'

Dockerfile можно создать с помощью пользовательской задачи Dockerfile. Инструкции для Dockerfile должны соответствовать определенной структуре. Инструкции в файле обрабатываются сверху вниз. Каждая инструкция добавляет новый слой в образ и фиксирует изменения. Docker исполняет инструкции, следуя процессу:

  • Запуск контейнера из образа.

  • Исполнение инструкции и внесение изменений в контейнер.

  • Запуск эквивалента docker commit для записи изменений в новый слой образа.

  • Запуск нового контейнера из нового образа.

  • Исполнение следующей инструкции в файле и повторение шагов процесса.

Задача создания Dockerfile будет выглядеть следующим образом:

task createDockerfile(type: Dockerfile, dependsOn: buildUberJar)  {
    destFile = project.file('build/distributions/uberJar/Dockerfile')
    from 'openjdk:8'
    addFile("app.jar", "/usr/src/cuba-sales/app.jar")
    defaultCommand("java", "-Dapp.home=/usr/src/cuba-sales/home", "-jar", "/usr/src/cuba-sales/app.jar")
}
  • Свойство from устанавливает базовый образ для Dockerfile, последующие инструкции выполняют построение поверх данного образа.

  • Свойство addFile определяет путь до JAR-файла, который будет скопирован в образ. Следует заметить, что JAR-файл должен быть размещен в одной папке с Dockerfile.

  • Свойство defaultCommand определяет набор инструкций, который будет выполнен при запуске контейнера.

Операции скачивания и публикации образов в публичный репозиторий Docker Hub или закрытый репозиторий могут потребовать аутентификации. Учетные данные можно передать в метод с помощью объекта registryCredentials. Определите свои учетные данные в файле gradle.properties:

dockerHubEmail = 'example@email.com'
dockerHubPassword = 'docker-hub-password'
dockerHubUsername = 'docker-hub-username'

После этого можно получить доступ к этим свойствам в файле build.gradle по имени:

def dockerRegistryCredentials = new DockerRegistryCredentials()
dockerRegistryCredentials.email = dockerHubEmail
dockerRegistryCredentials.password = dockerHubPassword
dockerRegistryCredentials.username = dockerHubUsername

Для создания образа приложения CUBA с помощью с Dockerfile и публикации этого образа в публичный репозиторий Docker Hub нужно определить следующие задачи:

task buildImage(type: DockerBuildImage, dependsOn: createDockerfile) {
    inputDir = createDockerfile.destFile.parentFile
    tags = ['sample-sales', '{docker-hub-username}/{default-repo-folder-name}:sample-sales']
    registryCredentials = dockerRegistryCredentials
}

task pushImage(type: DockerPushImage, dependsOn: buildImage) {
    tag = 'sample-sales'
    imageName = '{docker-hub-username}/{default-repo-folder-name}'
    registryCredentials = dockerRegistryCredentials
}

Настройте и соберите монолитный Uber JAR как показано в разделе Развертывание монолитного Uber JAR. После этого запустите задачу pushImage из терминала или из поля Search в Студии.

gradle pushImage

Эта задача последовательно собирает Uber JAR, генерирует Dockerfile с необходимыми инструкцими, создает образ и публикует его в репозиторий Docker Hub.