使用Gradle执行Docker命令

我想运行一些docker命令如

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

我已经尝试了几个插件,比如这个 ,但是没有一个是令人满意的,或者我错过了一些东西…

我的问题是,在我的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() } } 

如果可能的话,就像干净的方法那样的东西就是完美的。 但是,如果一个插件可以轻松地做到这一点,也可以

我没有尝试过,但是如何得到灵感来自Gradle中的Run shell命令而不是任务内部的回答,以及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 .") 

不pipe用。 相反, runDockerBuild可以重写成类似的东西

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

这是否指向正确的方向?

问题来自我误解了gradle是如何工作的。 在使用NPM成功构build一些项目而没有将其安装到我的计算机上之后,我认为Docker也是如此。 我错了,而NPM是NodeJS给的命令,Docker实际上是一个服务!

我做完之后

 apt-get install docker.io 

一切都很好,我终于可以执行我的docker命令使用

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