【问题标题】:Executing Docker commands with Gradle使用 Gradle 执行 Docker 命令
【发布时间】:2016-08-09 15:14:20
【问题描述】:

我想运行一些 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()
    }
}

如果可能的话,像 clean 方法中的 exec sh 这样的东西会是完美的。但是,如果一个插件可以轻松做到这一点,那也没关系

【问题讨论】:

    标签: gradle deployment docker


    【解决方案1】:

    我还没有尝试过,但是受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
        }
    }
    

    这是指向正确的方向吗?

    【讨论】:

    • 你说的对,确实我想要这样的东西,但是我无法执行docker命令,因为Gradle找不到它,但是我越来越近了
    【解决方案2】:

    问题来自我误解了 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"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 2023-03-26
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 2017-06-19
      • 2016-06-03
      • 2014-12-12
      • 2017-08-10
      相关资源
      最近更新 更多