Actual Spring Boot 2.0 Series (1) — Создание образов Docker с помощью Gradle

Spring Boot Java задняя часть Микросервисы Архитектура сервер Spring Docker gradle

предисловие

Обычно мы используемDockerfileпостроить проектDockerзеркало. Но также использоватьgradleПри компиляции проекта отдайте образПостроитьизагрузитьтребование. В этой статье объясняется, как использоватьgradleнаписать и настроитьDockerfileи генерироватьзеркало.

Статьи из этой серии

  1. Actual Spring Boot 2.0 Series (1) — Создание образов Docker с помощью Gradle
  2. Actual Spring Boot 2.0 Series (2) — глобальная обработка исключений и тестирование
  3. Actual Spring Boot 2.0 Series (3) — Подробное объяснение асинхронных вызовов с использованием @Async
  4. Actual Spring Boot 2.0 Series (4) — Использование WebAsyncTask для обработки асинхронных задач
  5. Actual Spring Boot 2.0 Series (5) — прослушиватель, сервлет, фильтр и перехватчик
  6. Actual Spring Boot 2.0 Series (6) — несколько реализаций одномашинных задач синхронизации

текст

1. Создайте проект

использоватьSpring InitializerСоздаватьgradleпроектspring-boot-gradle-for-docker, добавитьwebполагаться. получить начальныйbuild.gradleследующее:

buildscript {
    ext {
        springBootVersion = '2.0.2.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'


group = 'io.ostenant.springboot.sample'
version = '1.0'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

2. Настройте класс входа

Чтобы облегчить тестирование развертывания контейнера, вSpring BootНастройте контроллер в классе запуска, чтобы он реагировал на текущее системное время.

@RestController
@SpringBootApplication
public class Application {

    private ThreadLocal<SimpleDateFormat> threadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy/MM/dd hh:mm:ss"));

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @GetMapping("/")
    public String retrieveTime() {
        return threadLocal.get().format(new Date());
    }
}

3. Добавить плагин

использовать здесьgradle-docker плагинреализоватьdockerСборка изображения. Таким образом, мы можем напрямуюGradleнастроить в скриптеDockerfileдостигатьпостроить образназначение функции.

gradle-dockerПлагин загружен наjCenterиMavenCentralначальство. Так что только вdependenciesдобавить зависимостиse.transmode.gradle:gradle-docker:1.2готовые к использованиюdockerплагин.

buildscript {
    ext {
        springBootVersion = '2.0.2.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("se.transmode.gradle:gradle-docker:1.2")
    }
}

4. Применить плагины

Добавьте следующий код вbuild.gradleсередина

apply plugin: 'application'
apply plugin: 'docker'

если добавленоapplicationДля плагинов по умолчаниюgradle-dockerПлагин добавитdistDockerизgradle task, построитьСодержит все файлы программыизdockerзеркало.

5. Настройте информацию о сборке образа

5.1 Группа конфигурации

group = 'io.ostenant.springboot.sample'

5.2 Настройте имя образа и номер версии

jar {
    baseName = "spring-boot-gradle-for-docker"
    version = 1.0
}

из которых зеркальноtagСостав по умолчанию:Название группы проекта/приложения: номер версии

tag = "${project.group}/${applicationName}:${tagVersion}"
  • проект.группа: стандартнаяgradleсвойство, если оно не определено, плагин по умолчанию будет использоватьпропускать ${project.group}это свойство.

  • applicationName: когда приложение контейнеризованоназвание.

  • tagVersion: необязательный атрибут, будет использоваться как зеркалоЭтикетка. По умолчаниюproject.versionЕсли не указаноproject.version, затем используйтеlatestкак маркер.

5.3 Настройка базовой информации о сборке докера

distDocker {
    baseImage = "openjdk"
    maintainer = "harrison"
}

в,baseImageэквивалентноDockerfileобъявлено вFROM. объявлено впостроить образоснован наImage,maintainerэквивалентноMAINTAINER, заявляетзеркальный автор. если объявленоregistryАдрес, плагинПосле создания зеркального изображенияможет быть автоматическиpushна этот адрес. Другие конфигурации включаютdocker hubизадрес,имя пользователяипароль.

Более подробные случаи конфигурации следующие:

docker {
    baseImage 'openjdk'
    maintainer 'harrison'
    useApi true
    hostUrl 'http://myserver:4243'
    apiUsername 'user'
    apiPassword 'password'
    apiEmail 'me@mycompany.com'
}

6. Добавить задачу задачи

Базовая конфигурация завершена, нам также нужно добавитьtaskиспользуется вgradleпри компиляцииВыполнить сборку изображения.

Плагин предоставляет некоторыеМетод преобразования, используется для обозначенияDockerfileсерединаграмматика ключевых словВ следующей таблице могут быть сияющими по требованию:

Ключевые слова Dockerfile метод задачи градиента
ADD addFile(Closure copySpec)
addFile(String source, String dest)
addFile(File source, String dest)
CMD defaultCommand(List cmd)
ENTRYPOINT entryPoint(List entryPoint)
ENV setEnvironment(String key, String val)
EXPOSE exposePort(Integer port)
exposePort(String port)
RUN runCommand(String cmd)
USER switchUser(String userNameOrUid)
VOLUME volume(String... paths)
WORKDIR workingDir(String dir)

Ниже представлен проектtaskBuilderконфигурация задачи

task dockerBuilder(type: Docker) {
    applicationName = jar.baseName
    tagVersion = jar.version
    volume('/tmp')
    addFile("${jar.baseName}-${jar.version}.jar", "app.jar")
    entryPoint(["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", 'app.jar'])
    exposePort(8080)
    doFirst {
        copy {
            from jar
            into stageDir
        }
    }
}

После завершения сборки корневой каталог проектаbuild/dockerПапка появится нижеDockerfileиspring-boot-gradle-for-docker-1.0.jarдокумент. Среди них вышеперечисленныеtaskэквивалентно следующемуDockerfile.

FROM aglover/java8-pier
VOLUME ["/tmp"]
ADD spring-boot-gradle-for-docker-1.0.jar app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
EXPOSE 8080

если ты чувствуешьtaskнаписано наDockerfile заменить скриптОчень неудобно, можно же прямо вtaskуказано вDockfileизПуть файла, напрямую используйте существующий файл для создания изображения:

task buildDocker(type: Docker) {
    applicationName = jar.baseName
    tagVersion = jar.version
    dockerfile = file('Dockerfile')
    doFirst {
        copy {
            from jar
            into stageDir
        }
    }
}

пройти черезfile()уточнитьtaskИспользуйте расположенныйКорневой каталог проектаизDockerfileпроизводить зеркала.

7. Скомпилируйте и соберите образ Docker

Перейдите в корневой каталог проекта и запуститеgradleкоманда для упаковки и сборки.

$ ./gradlew clean build dockerBuilder --info

gradleбудет работать первымЛокальный тест, Затем выполнитьУпаковка проекта, далее согласноdocker-gradleплагинсборка изображения.

ждать, чтобы появитьсяBUILD SUCCESSFULЧтобы показать, что задача выполняется успешно. Это можно наблюдать по названию зеркала

io.ostenant.springboot.sample/spring-boot-gradle-for-docker:1.0

бегатьdocker imagesПроверьте локальный образ, чтобы дополнительно убедиться, что образ был создан успешно.

нижеприведенныйbuild.gradle полныйконфигурационный файл

buildscript {
    ext {
        springBootVersion = '2.0.2.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("se.transmode.gradle:gradle-docker:1.2")
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'application'
apply plugin: 'docker'


group = 'io.ostenant.springboot.sample'
version = '1.0'
sourceCompatibility = 1.8
targetCompatibility = 1.8
mainClassName = "io.ostenant.springboot.sample.Application"

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

jar {
    baseName 'spring-boot-gradle-for-docker'
    version '1.0'
}

distDocker {
    baseImage 'openjdk'
    maintainer 'harrison'
}

task dockerBuilder(type: Docker) {
    applicationName = jar.baseName
    tagVersion = jar.version
    volume('/tmp')
    addFile("${jar.baseName}-${jar.version}.jar", "app.jar")
    entryPoint(["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", 'app.jar'])
    exposePort(8080)
    doFirst {
        copy {
            from jar
            into stageDir
        }
    }
}

8. Запускаем контейнер с образом

Выполните следующую команду, запустите контейнер в соответствии с зеркалом, выставленным8080порт доступа.

$ docker run -d --name gradle-boot -p 8080:8080 io.ostenant.springboot.sample/spring-boot-gradle-for-docker:1.0

доступhttp://127.0.0.1:8080/, страница выведет текущее системное время, как показано на рисунке:

резюме

gradle-dockerПлагин также обеспечивает настройкуАдрес зеркального складаКонфигурацияDocker Remote ApiиDocker HubДля другого использования вы можете обратиться к проектуGitHubадрес для настройки с помощью:GitHub.com/транс режим/….


Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack

零壹技术栈

Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.