gradle - 使用 Gradle 执行 Docker 命令

标签 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()
    }
}

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

最佳答案

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

这是否指向正确的方向?

关于gradle - 使用 Gradle 执行 Docker 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38854548/

相关文章:

android - 如何使用Gradle使HoloEverywhere与新的Android项目一起使用?

java - 使用 Gradle 运行所有 JUnit 测试

java - 为什么我无法调试 Gradle 构建脚本的每一行?

deployment - iOS 8.1 无法安装 OTA Enterprise 应用程序 - "Unable to download app"

ruby-on-rails - 每当在服务器上有多个项目的 Cron

docker - 有没有办法按名称列出所有正在运行的 docker 容器?

android - 错误:在<declare-styleable>中-无法找到属性

maven - com.twelvemonkeys.servlet.image.IIOProviderContextListener

database - 适用于 Mac 的 Oracle 数据库快捷版

sockets - Pycharm Docker Unix/TCP 套接字(带有 unix :///var/run/docker. sock):权限被拒绝