2016-07-29 20 views
5

私は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。これはより実用的ですか?

答えて

1

ハードコードされたメインクラスをgradleプロジェクトプロパティで置き換えることをお勧めします。

jar { 
    manifest { 
     attributes 'Main-Class': main 
    } 
} 

gradle.propertiesファイルのデフォルトプロパティを設定します。

./gradlew buildDocker -Pmain=com.myapp.Playground 

編集:タスク

で同じことを達成するために、あなたがあなたとのGradleを呼び出すことができ com.myapp.Playgroundを実行しているjarファイルを使用して、あなたのドッキングウィンドウのコンテナを構築する必要があります。最後

main=com.myapp.Main 

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'を使って' main'を変更する 'playground'というタスクを定義する方法はありますか? – ordonezalex

+0

また、ドッカーは './gradlew build buildDocker'を2回実行するまで、アプリケーションでキャッシュされた' COPY'レイヤーを使用しています。 '-P'フラグを使用する場合も同様です。私はまだ 'buildDocker'タスクで' inputs'または 'outputs'プロパティーを使用していません。なぜDockerは最初にこの変更を検出/反映しないのでしょうか? – ordonezalex

+0

私は仕事に同じことを達成することを含むように私の答えを編集しました。残念なことに、ドッキング・レイヤーの問題は、この質問と私の知識の範囲外です。これはぼんやりした問題でした。 –

関連する問題