我有一个任务来容纳一个Spring&反应网络应用程序,以便非技术人员可以利用容器向客户演示应用程序。目前我们正在开发OSX&部署到由第三方公司管理的AWS上的Tomcat,非技术人员使用Windows笔记本电脑处理他们的东西。 到目前为止,我在OSX中有bash脚本,它将创建一个包含Java 8 SDK& maven安装,&这会将应用程序编译成war文件。第二个脚本创建并初始化mongodb容器&给它一个名字,第三个脚本创建一个Tomcat / Java 8容器,将war文件加载到它中,将它链接到mongodb容器&设置它运行。在OSX上使用bash工作正常,但我发现如果我在Windows 10上的cygwin中尝试它并不起作用,而我的CMD / Powershell-fu太弱而无法以Windows本机方式编写脚本。
所以,我正在尝试在可以在OSX,AWS linux服务器和运行的OSX上运行的脚本中。 Windows 10,&作为一名Java开发人员,我想到了Groovy。这是我第一次使用Groovy编写Docker脚本,所以我最终采用了以下结构:
println "docker build -f Dockerfile.packager -t mycontainer .".execute().text
我想知道Docker是否有我可以插入的Java或Groovy API&做的事情如下:
docker.build("Dockerfile.packager").tag("mycontainer")
目前我的脚本正在确定项目根目录的位置。将Docker run命令构建为字符串,如:
File emToo = new File(System.getProperty("user.dir")+"/.m2")
String currentDirectory = new File(".").getCanonicalPath()
String projectRoot = new File(currentDirectory+"/../").getCanonicalPath()
我通过命令行提示符从用户那里获得一个选项字符串,“你想要QA还是Dev?” &安培;然后:
String dockerRunCmd = "docker run -it -v $projectRoot/:/usr/local/build/myproject:cached -v ${emToo.getCanonicalPath()}:/root/.m2:cached mycontainer $option"
println dockerRunCmd.execute().text
目前在要求选项后似乎没有做任何事情 - 它有点轰炸。我将运行命令输出到屏幕,&如果我将它复制/粘贴到脚本目录中的命令行,则说明无法找到父pom。但请记住,如果我运行OSX bash脚本来执行此操作,它可以正常工作。 bash脚本基本上是:
#! /usr/bin/env bash
CWD=`pwd`
options=$1
docker run -it -v $CWD/../:/usr/local/build/myproject:cached -v ~/.m2:/root/.m2:cached --rm mycontainer $options
......我认为这相同,对吧?哪里出错?
更新:我发现了一个错误 - 我应该将emToo设置为
new File(System.getProperty("user.home")+"/.m2")
。 user.dir只是选择当前目录,&通常,maven .m2目录位于用户的家中。目前,脚本给我一个运行命令,如果我剪切/粘贴到命令行,但不允许我在Groovy中的字符串上调用.execute()。如果我可以使用它,那么就不需要建议使用docker-client项目了。
答案 0 :(得分:1)
有很多方法可以通过groovy或java与docker进行通信(sdk'} {/ 3}}:
许多其他人也可以在github上找到。
但是当我看到你正在使用maven时,你可能会更容易使用可以构建,推送图像,运行容器等的超棒的docker maven插件(https://github.com/docker-java/docker-java)。