首页 > 解决方案 > 使用 dockerode 在 docker 容器中运行 java 代码

问题描述

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

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

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

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;
})

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

标签: javascriptnode.jsdockerdockerode

解决方案


根据您要实现的目标,您可能希望在 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). 我不知道这是否符合“发送字符串”的条件。


推荐阅读