使用Gradle执行Docker命令

时间:2016-08-09 15:14:21

标签: gradle deployment docker

我想运行一些docker命令,例如

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

我已尝试过几个插件,例如this one,但这些插件都不令人满意,或者我错过了一些东西......

我的问题是,在我的gradle任务中运行docker命令的最佳方法是什么

这是我的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一样的东西将是完美的。但是,如果一个插件可以很容易地做到这一点,那也没关系

2 个答案:

答案 0 :(得分: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(".")
    }
}

请注意,需要在列表中指定args。例如。如果你想发出像

这样的命令
docker build -t fail .

使用runDockerBuild,我希望

runDockerBuild("-t fail .")

不起作用。相反,runDockerBuild可以重写为

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

这指向正确的方向吗?

答案 1 :(得分:1)

问题来自于我误解了gradle实际上是如何工作的。 使用NPM成功构建一些项目而不将其安装在我的计算机上,我虽然对Docker来说也是如此。我错了,虽然NPM是NodeJS给出的命令,但Docker实际上是一种服务!

我做完后

apt-get install docker.io

一切都很好,我终于可以使用

执行我的docker命令了
def dockerTest(version, buildTag){
    exec {
         executable "sh"
         args "-c", "sudo docker ps -a"
    }
}