我目前有一个gradle应用程序,并且正在使用gradle-docker插件。
我的build.gradle文件中有两个Docker任务,每个任务都应该为相应的Container Registry(由project.group指定)标记一个映像:
task buildDockerSandbox(type: Docker) {
project.group = 'gcr.io/sandbox'
baseImage "java:8"
runCommand("mkdir a")
addFile("a.jar", "a/")
workingDir("/a")
entryPoint(["java", "-Dspring.profiles.active=sandbox", "-jar", "a.jar"])
}
task buildDockerProd(type: Docker) {
project.group = 'gcr.io/prod'
baseImage "java:8"
runCommand("mkdir b")
addFile("b.jar", "b/")
workingDir("/b")
entryPoint(["java", "-Dspring.profiles.active=prod", "-jar", "b.jar"])
}
但是,当我运行“ gradle buildDockerSandbox”时,在buildDockerSandbox任务运行时,行“ project.group ='gcr.io/prod'”被注册,从而导致为错误的环境标记映像。
为了防止这种情况,我需要禁用未运行“ project.group = {group}”行的任务,以防止这种情况,但是不知道如何。
预期结果:运行“ gradle buildDockerSandbox”将映像标记为“ gcr.io/sandbox:{applicationName}”,运行“ gradle buildDockerProd”将映像标记为“ gcr.io/prod”: {applicationName}”。
实际结果:这两个任务都将图像标记为“ gcr.io/prod:{applicationName}”
答案 0 :(得分:3)
您在任务结束处添加的内容将在Gradle配置您的任务时应用,而不是在实际运行它们时应用。因此,在这种情况下,您要定义两个任务,并且它们都设置了一个共享属性project.group
。因此,无论您实际上打算运行哪个任务,最后配置的任何任务都将“获胜”。
有许多用于Gradle的Docker插件,在我看来,您使用的是Transmode中的一个。从文档看来,您无法在同一Gradle项目中使用不同的Docker存储库名称构建两个映像。因此,我想说的是您的选择是在构建映像后自行设置名称(例如在doLast块中),将其拆分为两个Gradle项目,或使用另一个更可定制的Docker插件。 bmuschko中的一个可能是使用最广泛,功能最丰富的一个。