Я до сих пор новичок в Docker и Gradle, но я пытаюсь настроить сборку Gradle, которая создает изображение Docker.Задача Gradle для игровой площадки Java
Я только что закончил настройку Dockerfile
, которая локально развертывает и запускает банку, как ожидалось. У меня это в моем build.gradle
:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'se.transmode.gradle:gradle-docker:1.2'
}
}
plugins {
id 'com.github.johnrengelman.shadow' version '1.2.3'
}
apply plugin: 'docker'
jar {
manifest {
attributes 'Main-Class': 'com.myapp.Main'
}
}
task buildDocker(type: Docker, dependsOn: shadowJar) {
push = false
applicationName = jar.baseName
tagVersion = 'latest'
dockerfile = file('src/main/docker/Dockerfile')
copy {
from shadowJar
into stageDir
}
}
Я бегу ./gradlew build buildDocker
построить изображение. Я доволен этим до сих пор.
Обычно я создаю класс throwaway (например, Playground.java
) с помощью метода main
, который я могу запускать и игнорировать. Обычно я запускаю это в среде IDE, но теперь я хотел бы иметь возможность подключаться к другим контейнерам Docker, которые, как я знаю, будут работать.
Я знаю, что я мог бы попытаться изменить sourceSets
я использую, исключив com.myapp.Main
, но я представлял, что может быть более элегантное решение, напоминающее это:
task buildDockerPlayground(type: Docker, dependsOn: shadowJar) {
main = 'com.myapp.Playground'
push = false
applicationName = jar.baseName
tagVersion = 'latest'
dockerfile = file('src/main/docker/Dockerfile')
copy {
from shadowJar
into stageDir
}
}
Другой подход может иметь другую задачу, Я использую для замены build
, когда я звоню ./gradlew build buildDocker
, например ./gradlew playground buildDocker
. Это более практично?
Мне нравится предложение об удалении жестко закодированного атрибута. Есть ли способ установить «главное» через задачу? Например, способ определить задачу 'playground', которая использует' build' и изменяет 'main' перед запуском' build'? – ordonezalex
Кроме того, докер использует кешированный слой 'COPY' с приложением, пока я не запустил' ./gradlew build buildDocker' второй раз. То же самое относится к тому, когда я использую флаг '-P'. Я еще не использую свойства 'input' или' output' в задаче 'buildDocker'. Почему Docker не обнаруживает/не отражает это изменение в первый раз? – ordonezalex
Я отредактировал свой ответ, чтобы включить достижение той же цели в задаче. К сожалению, проблема смешивания докеров не выходит за рамки этого вопроса и моих знаний. Это проблема градиента. –