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.