私はDockerとGradleの新機能ですが、Dockerイメージを作成するGradleビルドをセットアップしようとしています。Javaプレイグラウンド用のGradleタスク
私はちょうど期待どおりにjarをローカルに展開して実行する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
。これはより実用的ですか?
ハードコードされた属性を削除することをおすすめします。タスクを通して 'main'を設定する方法はありますか?例えば、ビルドを実行する前に 'build'を使って' main'を変更する 'playground'というタスクを定義する方法はありますか? – ordonezalex
また、ドッカーは './gradlew build buildDocker'を2回実行するまで、アプリケーションでキャッシュされた' COPY'レイヤーを使用しています。 '-P'フラグを使用する場合も同様です。私はまだ 'buildDocker'タスクで' inputs'または 'outputs'プロパティーを使用していません。なぜDockerは最初にこの変更を検出/反映しないのでしょうか? – ordonezalex
私は仕事に同じことを達成することを含むように私の答えを編集しました。残念なことに、ドッキング・レイヤーの問題は、この質問と私の知識の範囲外です。これはぼんやりした問題でした。 –