Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用DockerRode在docker容器中运行java代码_Javascript_Node.js_Docker_Dockerode - Fatal编程技术网

Javascript 使用DockerRode在docker容器中运行java代码

Javascript 使用DockerRode在docker容器中运行java代码,javascript,node.js,docker,dockerode,Javascript,Node.js,Docker,Dockerode,我想将一些java代码作为字符串发送到API,然后在docker容器中运行并返回控制台输出,我已经设法用Python实现了这一点,但由于java首先需要编译,然后再运行,我不确定如何实现该语言 目前正在使用python映像,但我对java不太熟悉,我不确定如何使用它 我的环境是使用typescript的node和使用dockerode模块的im let container = await docker.createContainer({ Image: 'python', Tty: t

我想将一些java代码作为字符串发送到API,然后在docker容器中运行并返回控制台输出,我已经设法用Python实现了这一点,但由于java首先需要编译,然后再运行,我不确定如何实现该语言

目前正在使用python映像,但我对java不太熟悉,我不确定如何使用它

我的环境是使用typescript的node和使用dockerode模块的im

let container = await docker.createContainer({
   Image: 'python',
   Tty: true,
   Cmd: ['/bin/bash'],
   StdinOnce: true
});
在运行python之后,我可以通过将字符串添加到Cmd直接将其传递到容器,但不确定如何将字符串传递到文件中,然后编译并运行它

var options = {
   Cmd: ['python', '-c'],
   AttachStdout: true,
   AttachStderr: true,
};

options.Cmd.push(code);

let exec = await container.exec(options);
我只有一个监听器来捕获输出流,以后可以使用它

stdout.on('data', (chunk: any) => {
   let data = chunk.toString('utf8').split(/\r?\n/).filter((str: string) => {return str.length});
   output = data;
})

任何关于使用哪个图像以及如何传递代码以获得输出的建议都将不胜感激

根据您试图实现的目标,您可能希望在docker容器中编译代码,或者绑定装载或将文件推入容器中

本例只是将当前工作目录装载(绑定)到容器中,并调用
javac
(或
java
)。生成的
.class
文件将显示在当前目录中(仅适用于终端位于主机上的系统)。然后可以使用
java
和类名重新运行相同的命令来执行它

docker.run(
  'java:8',
  ['javac', 'yourclass.java'],
  process.stdout,
  {
    HostConfig: {
      AutoRemove: true,
      Binds: [
          `${process.cwd()}:/app`
      ]
    },
    WorkingDir: '/app'
  }
)
您的问题是“希望将一些java代码作为字符串发送到API”,但究竟什么是“将字符串发送到API”还不清楚。按照Python的做法,您可以
echo'${code}>myclass.java
,尽管您可能会遇到带引号的转义问题


另一种方法是创建容器,然后
container.putArchive('yourclass.java',options)
。我不知道这是否符合“发送字符串”的条件

这真的取决于你的眼睛看起来如何。Java11引入了“单类特性”。意思:当您只有一个自包含类时,您可以直接执行
javathatclass.java
。。。JVM会自动为您编译它。但是如果您有多个类,那么您必须以某种方式显式地触发编译器。