2016-07-29 2 views
5

Я до сих пор новичок в Docker и Gradle, но я пытаюсь настроить сборку Gradle, которая создает изображение Docker.Задача Gradle для игровой площадки Java

Я только что закончил настройку 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 построить изображение. Я доволен этим до сих пор.

Обычно я создаю класс throwaway (например, Playground.java) с помощью метода main, который я могу запускать и игнорировать. Обычно я запускаю это в среде IDE, но теперь я хотел бы иметь возможность подключаться к другим контейнерам Docker, которые, как я знаю, будут работать.

Я знаю, что я мог бы попытаться изменить sourceSets я использую, исключив com.myapp.Main, но я представлял, что может быть более элегантное решение, напоминающее это:

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 
    } 
} 

Другой подход может иметь другую задачу, Я использую для замены build, когда я звоню ./gradlew build buildDocker, например ./gradlew playground buildDocker. Это более практично?

ответ

1

Я предлагаю заменить основной класс с жестким кодированием на свойство проекта gradle.

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

Установите это свойство по умолчанию в свой файл gradle.properties.

main=com.myapp.Main 

Наконец, когда вам нужно создать свой Docker контейнер, который использует баночку работает com.myapp.Playground вы можете вызвать Gradle с:

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

Edit: Для того, чтобы достичь того же в задаче

project.ext.main = 'com.myapp.Main' 

task play(){ 
    project.main = 'com.myapp.Playground' 
    finalizedBy buildDocker 
} 

jar { 
    manifest { 
     attributes 'Main-Class': project.main 
    } 
} 
+0

Мне нравится предложение об удалении жестко закодированного атрибута. Есть ли способ установить «главное» через задачу? Например, способ определить задачу 'playground', которая использует' build' и изменяет 'main' перед запуском' build'? – ordonezalex

+0

Кроме того, докер использует кешированный слой 'COPY' с приложением, пока я не запустил' ./gradlew build buildDocker' второй раз. То же самое относится к тому, когда я использую флаг '-P'. Я еще не использую свойства 'input' или' output' в задаче 'buildDocker'. Почему Docker не обнаруживает/не отражает это изменение в первый раз? – ordonezalex

+0

Я отредактировал свой ответ, чтобы включить достижение той же цели в задаче. К сожалению, проблема смешивания докеров не выходит за рамки этого вопроса и моих знаний. Это проблема градиента. –