我需要使用Transmode docker gradle插件将docker镜像推送到IBM Cloud映像存储库。 push命令是标准的docker push,由gradle plygin执行,但在此之前我需要执行“ibmcloud login”命令集:
task loginToIBMCloud (type: Exec) {
group = 'docker'
commandLine '/usr/local/bin/ibmcloud', 'login', '-a', 'https://api.eu-de.bluemix.net', '--apikey', 'MYAPIKEY'
commandLine '/usr/local/bin/ibmcloud', 'cr', 'login'
commandLine '/usr/local/bin/ibmcloud', 'cr', 'region-set', 'eu-central'
}
这个命令工作正常,但是后来当我gradle做推送时,我得到一个错误,因为docker命令的行为与之前的登录没有发生一样:
* What went wrong:
Execution failed for task ':buildDockerAndPush'.
> Docker execution failed
Command line [/usr/local/bin/docker push registry.eu-de.bluemix.net/eliza/tourism/mtp/ms/mtpms_weather:0.0.2b] returned:
unauthorized: authentication required
这是构建并将映像推送到存储库的插件任务:
task buildDockerAndPush(type: Docker) {
group = 'docker'
push = true;
tagVersion = "${project.version}"
exposePort(8080)
addFile {
from jar
rename {'app.jar'}
}
entryPoint(['java', '-Djava.security.egd=file:/dev/./urandom', '-jar', '/app.jar'])
}
在shell中执行相同的命令系列是完美的。 ibm云没关系,docker build正常,docker push就可以了。该映像已正确推送到IBM存储库,该存储库稍后可在kubectl命令中运行。
那么......如何在gradle中的先前Exec任务中执行登录仍然在第二个任务中有效。
我发现“ibmcloud cr”命令几乎可以完全取代docker命令,因此在gradle插件中将其替换为docker命令可以有效地在IBM Cloud中构建映像。甚至不需要“推”,甚至不需要本地泊坞机运行。这不完全是解决方案,但解决了登录+创建+将图像推送到IBM Cloud的原始问题。
要替换docker命令,只需在gradle构建脚本中执行此操作(如果不同,显然可以使用正确的路径):
docker {
dockerBinary "/usr/local/bin/ibmcloud rc"
}
并记住不包括
push = true;
在Docker类型任务中,因为现在不需要推送。