предисловие
Обычно мы используемDockerfileпостроить проектDockerзеркало. Но также использоватьgradleПри компиляции проекта отдайте образПостроитьизагрузитьтребование. В этой статье объясняется, как использоватьgradleнаписать и настроитьDockerfileи генерироватьзеркало.
Статьи из этой серии
- Actual Spring Boot 2.0 Series (1) — Создание образов Docker с помощью Gradle
- Actual Spring Boot 2.0 Series (2) — глобальная обработка исключений и тестирование
- Actual Spring Boot 2.0 Series (3) — Подробное объяснение асинхронных вызовов с использованием @Async
- Actual Spring Boot 2.0 Series (4) — Использование WebAsyncTask для обработки асинхронных задач
- Actual Spring Boot 2.0 Series (5) — прослушиватель, сервлет, фильтр и перехватчик
- 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
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.