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

Running java code in a docker container using dockerode

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

目前正在使用 python 图片,但我对 java 不太熟悉,我不确定如何处理它。

我的环境是使用 typescript 的节点,我使用 dockerode 模块。

let container = await docker.createContainer({
   Image: 'python',
   Tty: true,
   Cmd: ['/bin/bash'],
   StdinOnce: true
});

我可以通过在 运行ning 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 和 class 名称重新 运行 相同的命令来执行它。

docker.run(
  'java:8',
  ['javac', 'yourclass.java'],
  process.stdout,
  {
    HostConfig: {
      AutoRemove: true,
      Binds: [
          `${process.cwd()}:/app`
      ]
    },
    WorkingDir: '/app'
  }
)

您的问题是说您 "want to send some java code as a string to an API",但尚不清楚 "sending a string to an API" 的确切条件。按照您对 Python 所做的操作,您可以 echo '${code}' > myclass.java,尽管您冒着 运行 转义引号问题的风险。

另一种方法是创建容器,然后 container.putArchive('yourclass.java', options)。我不知道这是否符合 "sending a string"。