Java操作系统的Gradle任务
问题描述:
我对Docker和Gradle仍然很陌生,但我试图设置构建Docker镜像的Gradle构建。Java操作系统的Gradle任务
我刚刚完成设置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
打造的形象。到目前为止我对此感到满意。
通常我会用main
方法创建一次性类(例如Playground.java
),我可以运行并忽略它。通常我只是在IDE中运行它,但现在我希望能够连接到我知道将运行的其他Docker容器。
我知道我可以尝试通过排除com.myapp.Main
改变我使用sourceSets
,但我想象有可能是一个更优雅的解决方案类似这样的:
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
}
}
另一种方法可能是有另一个任务当我拨打./gradlew build buildDocker
时,我用来替换build
,例如./gradlew playground buildDocker
。这更实用吗?
答
我建议用gradle项目属性替换硬编码的主类。
jar {
manifest {
attributes 'Main-Class': main
}
}
在gradle.properties
文件中设置该默认属性。
main=com.myapp.Main
最后,当你需要构建一个使用运行 com.myapp.Playground
罐子您的码头工人的容器,你可以调用gradle这个有:
./gradlew buildDocker -Pmain=com.myapp.Playground
编辑:为了实现一个任务同样的事情
project.ext.main = 'com.myapp.Main'
task play(){
project.main = 'com.myapp.Playground'
finalizedBy buildDocker
}
jar {
manifest {
attributes 'Main-Class': project.main
}
}
我喜欢删除硬编码属性的建议。有没有办法通过任务设置'main'?例如,在运行'build'之前定义一个使用'build'并更改'main'的任务'playground'的方法? – ordonezalex
另外,docker正在使用缓存的'COPY'图层,直到我第二次运行'./gradlew build buildDocker'。这同样适用于我使用'-P'标志的情况。我没有在'buildDocker'任务中使用'inputs'或'outputs'属性。为什么Docker不能在第一次检测/反映这种变化? – ordonezalex
我编辑了我的答案,包括在任务中实现同样的事情。不幸的是,docker分层问题超出了这个问题的范围和我的知识范围。这是一个问题。 –