我对Docker和Gradle还不太熟悉,但是我正在尝试设置一个Gradle构建来构建一个Docker镜像。
我刚刚完成了一个Dockerfile
的设置,可以在本地部署并运行jar文件。我在我的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
来构建镜像。目前为止我对此感到满意。通常我会创建一个临时类(例如
Playground.java
),其中包含一个可以运行和忽略的main
方法。通常我只是在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 buildDocker
时使用该任务来替换build
,例如./gradlew playground buildDocker
。这样做更实用吗?
main
的方法?例如,定义一个名为playground
的任务,该任务使用build
并在运行build
之前更改main
? - ordonezalex./gradlew build buildDocker
之前一直使用缓存的COPY
层与应用程序。当我使用-P
标志时也是如此。我还没有在buildDocker
任务中使用inputs
或outputs
属性。为什么 Docker 第一次不会检测/反映这个变化? - ordonezalex