如何在node js spawn中运行复杂命令?

我正在为nodejs中的docker命令行开发一个lib,我仍然在开始,我只是尝试在节点js中使用spawn基本的docker运行命令 – 一切工作正常,但它不适用于下面的复杂情况。

我想docker run --rm -it julia:0.3.6 julia -E "[x^2 for x in 1:100]"在nodejs中,但我正在gettting下面的错误 –

input设备不是TTY

 Docker Shell existed with status = 1 

在代码下面 –

  const spawn = require('child_process').spawn, dockerDeamon = spawn("docker", ["run","--rm", "-it", "julia:0.3.6", "-E", "\" [x^2 for x in 1:100]\""] ); dockerDeamon.stdout.on('data', data => { console.log(`${data}`); }); dockerDeamon.stderr.on('data', data => { console.log(`${data}`); }); dockerDeamon.on('close', code => { console.log(`Docker Shell existed with status = ${code}`); }); 

有没有更好的方法来执行上面的脚本?

您将-t (– --tty )标志传递给Docker,它告诉它它应该将input和输出连接到terminal(TTY)。 但是,当你使用spawn ,你需要将它附加到程序中的Node.jsstream中。 Docker注意到这一点,因此给出错误Input device is not a TTY 。 因此,在这种情况下,您不应该使用-t标志。


此外,请注意,在最后一个参数"\" [x^2 for x in 1:100]\""不需要嵌套引号。 引用的目的是在shell中运行时保留参数中的空格和其他特殊字符,但是当你使用spawn你并没有使用shell。

所以你的陈述应该是这样的:

 dockerDeamon = spawn("docker", ["run","--rm", "-i", "julia:0.3.6", "julia", "-E", "[x^2 for x in 1:100]"] );