2016-08-09 3 views
0

Я хотел бы выполнить некоторые команды Докер, такие какВыполнение Docker команды с Gradle

docker login -u foo -p bar myregistry 
docker build --pull=true -t myregistry/myimage path/to/dockerfile 
docker push myregistry/myimage 

Я пытался несколько плагинов для него, таких как this one, но ни один из них не был удовлетворительным, или, может быть, я что-то отсутствует. ..

Мой вопрос, что это лучший способ для запуска команды Docker внутри моего Gradle задач

Вот мой файл build.gradle и то, что я хотел бы, чтобы он сделал

import GenerateDockerFile 

apply plugin : 'groovy' 

repositories { 
    mavenCentral() 
    jcenter() 
} 

dependencies { 
    compile 'org.codehaus.groovy:groovy-all:2.4.7' 
    compile localGroovy() 
    compile gradleApi() 
    classpath 'com.bmuschko:gradle-docker-plugin:3.0.1' 
} 

def copyFiles() { 
    //Some stuff 
} 

def versionNumber(){ 
    //Some stuff  
} 

def clean(){ 
    exec { 
     executable "sh" 
     args "-c", "ls" 
    } 
} 
} 

task build(){ 

    copyFiles() 

    versionNumber() 

    def version = new File('tmp_version').text 
    def buildTag= "" 
    if (project.hasProperty('args')) { 
     buildTag = args 
    } 
    else{ 
     buildTag = System.console().readLine 'Enter a build tag' 
    } 


    println "\nGenerating DockerFile for version $version with build tag $buildTag" 

    GenerateDockerFile.configure(version, buildTag); 

    println 'DockerFile generated' 

    //Execute docker commands here 
    // docker login .... 

    doLast { 
     clean() 
    } 
} 

Если возможно, что-то вроде exec sh, как в чистом методе, было бы идеально. Однако, если плагин может легко это сделать, это тоже нормально

ответ

1

Проблема возникла из-за того, что я неправильно понял, как работает град. После успешного создания некоторых проектов с использованием NPM без его установки на моем компьютере, я бы это сделал для Docker. Я был неправ, в то время как NPM - это команда, предоставленная NodeJS, Docker на самом деле является сервисом!

После того, как я сделал

apt-get install docker.io 

Все было прекрасно, и я, наконец, смог выполнить свои команды Docker с помощью

def dockerTest(version, buildTag){ 
    exec { 
     executable "sh" 
     args "-c", "sudo docker ps -a" 
    } 
} 
2

Я не пробовал, но как насчет следующего предложения, вдохновленного ответом на Run shell command in gradle but NOT inside a task и обсуждением на https://discuss.gradle.org/t/how-to-execute-shell-command-source-or-dot-doesnt-work-with-exec/7271/9?

Для запуска двух команд

docker login localhost:8080 
docker build . 

вы можете попробовать с:

def runDockerLogin(String target) { 
    exec { 
     executable "docker" 
     args "login", target 
    } 
} 

def runDockerBuild(String target) { 
    exec { 
     executable "docker" 
     args target 
    } 
} 

task doIt { 
    doLast { 
     runDockerLogin("localhost:8080") 
     runDockerBuild(".") 
    } 
} 

Обратите внимание, что арг должны быть указаны в списках. Например. если вы хотите выдать команду как

docker build -t fail . 

с помощью runDockerBuild, то я ожидаю, что

runDockerBuild("-t fail .") 

не будет работать. Вместо этого runDockerBuild может быть переписан на что-то вроде

def runDockerBuild(String target) { 
    exec { 
     executable "docker" 
     args "-t", "fail", target 
    } 
} 

Это указательный в правильном направлении?

+0

Вы направляете это право, на самом деле я хотел бы что-то вроде этого, но я могу» t выполнить команду docker, поскольку Gradle не может ее найти, однако я становлюсь ближе –