3

我正在尝试在我的节点应用程序的 dockerode 容器中编译和执行 java 程序。我可以通过首先tmp.java使用基本的 javascript 写入文件然后运行以下 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()
})      

tmp.class但是,当我指定Volumes和选项时,这不会产生任何输出并且不会按预期生成WorkingDir,当我省略这些选项时,我会收到错误消息:javac: file not found: tmp.java我认为这意味着我的卷没有正确安装。本质上,我正在尝试创建一个临时微容器,在容器中编译并运行我的 java 程序,然后销毁容器。因此,我无法在我的主机系统上本地安装 JDK 和编译程序,并且必须基本上只在容器内工作。

我目前正在尝试使用命令式 Docker 命令来实现此用例,并且能够使用上面的 cli 命令来完成此操作,但是,我无法使用dockerodefor node 做同样的事情(无论是通过命令式命令还是使用 dockerfile) .

我真的很感激这方面的任何帮助!

4

1 回答 1

1

问题是您的目录未映射。

此选项对象等效于选项--rm -v $PWD:/app -w /app

  {
    HostConfig: {
      AutoRemove: true,
      Binds: [
          `${process.cwd()}:/app`
      ]
    },
    WorkingDir: '/app'
  }
  • AutoRemove: true--rm
  • Binds: [ `${process.cwd()}:/app` ]-v $PWD:/app, 与process.cwd()as$PWD
  • WorkingDir: '/app'-w /app

当我得到TypeError: dest.on is not a function. 运行dockerode@3.1.0时,我必须将输出流设置为第三个参数,将选项对象设置为第四个参数。

所以完整的命令看起来像这样:

docker.run(
  'java:8',
  ['javac', 'tmp.java'],
  process.stdout,
  {
    HostConfig: {
      AutoRemove: true,
      Binds: [
          `${process.cwd()}:/app`
      ]
    },
    WorkingDir: '/app'
  }
)
于 2020-03-13T06:11:06.053 回答