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