使用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" } }