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.