2016-07-29 96 views
5

我对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。这更实用吗?

回答

1

我建议用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 
    } 
} 
+0

我喜欢删除硬编码属性的建议。有没有办法通过任务设置'main'?例如,在运行'build'之前定义一个使用'build'并更改'main'的任务'playground'的方法? – ordonezalex

+0

另外,docker正在使用缓存的'COPY'图层,直到我第二次运行'./gradlew build buildDocker'。这同样适用于我使用'-P'标志的情况。我没有在'buildDocker'任务中使用'inputs'或'outputs'属性。为什么Docker不能在第一次检测/反映这种变化? – ordonezalex

+0

我编辑了我的答案,包括在任务中实现同样的事情。不幸的是,docker分层问题超出了这个问题的范围和我的知识范围。这是一个问题。 –