【发布时间】:2020-03-13 14:11:06
【问题描述】:
我正在尝试在我的节点应用程序的 dockerode 容器中编译和执行 java 程序。我可以通过首先使用基本 javascript 写入 tmp.java 文件然后运行以下 shell 命令来做到这一点:
docker run --rm -v $PWD:/app -w /app java:8 javac tmp.java
docker run --rm -v $PWD:/app -w /app java:8 java tmp
但是,我现在正尝试过渡到使用 dockerode 模块,并尝试按如下方式复制此功能(基于 dockerode github 上的示例):
docker.run(
'java:8',
['javac', 'tmp.java'],
{
Volumes: {
'/': {}
},
WorkingDir: '/'
},
process.stdout
)
.then(data => {
var output = data[0]
console.log('OUTPUT: ', output)
var container = data[1]
console.log(output.StatusCode)
return container.remove()
})
但是,当我指定 Volumes 和 WorkingDir 选项时,这不会产生任何输出并且不会像预期的那样生成 tmp.class,当我忽略这些选项时,我会收到错误:javac: file not found: tmp.java 我假设这意味着我的音量没有正确安装。
本质上,我正在尝试创建一个临时微容器,在容器中编译并运行我的 java 程序,然后销毁容器。因此,我无法在我的主机系统上本地安装 JDK 和编译程序,并且基本上只能在容器内工作。
我目前正在尝试使用命令式 Docker 命令来实现此用例,并且能够使用上面的 cli 命令来完成此操作,但是,我无法使用 dockerode 为节点做同样的事情(无论是通过命令式命令或使用 dockerfile)。
非常感谢您对此的任何帮助!
【问题讨论】:
-
看到
javac命令生成PNG 文件作为其输出,我会感到非常惊讶。这实际上是您得到的结果,还是得到某种文本输出或异常? -
我阅读这个问题的第一直觉是在主机上安装 JDK 并运行本地
javac命令,而不是尝试通过 Docker 运行它;我的第二个方法是在 Dockerfile 中运行它,而不是通过命令式docker run命令。我认为您的 Node 代码在/app上挂载了一个匿名卷,而不是绑定挂载主机目录。 -
@DavidMaze 我用更多细节更新了我的问题,如果我能澄清其他任何事情,请告诉我。我明白你关于在本地运行
javac的观点,问题是我不确定在主机上安装 JDK 是否适合我的用例,因为我基本上是在尝试完全远程处理代码执行。跨度>
标签: javascript node.js docker dockerode