2016-07-29 3 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 

편집 : 당신이 com.myapp.Playground를 실행하는 항아리를 사용하여 고정 표시기 컨테이너를 구축해야 할 때

main=com.myapp.Main 

마지막으로, 당신은 Gradle을 가진를 호출 할 수 있습니다 작업에서 같은 일을 달성하기 위해

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는 ./gradlew build buildDocker를 두 번 실행할 때까지 앱과 함께 캐시 된'COPY' 레이어를 사용하고 있습니다. '-P' 플래그를 사용할 때도 마찬가지입니다. 나는'buildDocker' 작업에서'inputs' 또는'outputs' 속성을 아직 사용하지 않고 있습니다. Docker가이 변경 사항을 처음으로 감지/반영하지 않는 이유는 무엇입니까? – ordonezalex

+0

과제에서 동일한 것을 달성하는 것을 포함하도록 내 대답을 편집했습니다. 불행히도, 도커 레이어링 문제는이 질문과 지식의 범위를 벗어납니다. 이것은 큰 문제였습니다. –