我的任务是将 Spring 和 React Web 应用程序容器化,以便非技术人员可以利用容器向客户演示应用程序。目前,我们在 OSX 上进行开发并部署到由第三方公司管理的 AWS 上的 Tomcat,非技术人员使用 Windows 笔记本电脑进行工作。 到目前为止,我在 OSX 中有 bash 脚本,它将创建一个安装了 Java 8 SDK 和 maven 的 Packager 容器,并将应用程序编译成一个 war 文件。第二个脚本创建并初始化一个 mongodb 容器并为其命名,第三个脚本创建一个 Tomcat/Java 8 容器,将 war 文件加载到其中,将其链接到 mongodb 容器并设置其运行。在 OSX 上的 bash 中,这工作正常,但我发现如果我在 Windows 10 上的 cygwin 中尝试它,它就不起作用,而且我的 CMD/Powershell-fu 太弱,无法以 Windows native 方式编写脚本。
因此,我尝试使用可以在 OSX、AWS Linux 服务器和 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 运行命令构建为字符串,例如:
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 项目。
最佳答案
从 groovy 或 java 与 docker 通信的方式有多种(sdk 列于 https://docs.docker.com/engine/api/sdks/#other-languages ):
- Groovy ( https://github.com/gesellix/docker-client )
- Java ( https://github.com/docker-java/docker-java )
许多其他内容也可以在 github 上找到。
但是正如我所看到的,您正在使用 Maven,所以您可能会更容易使用很棒的 docker maven 插件( https://dmp.fabric8.io ),它可以构建、推送图像、运行容器等。
关于docker - 需要知道如何使用 Groovy 自动化 Docker 构建和运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44022472/