2017-08-08 9 views
4

私はnodejsのdockerコマンドライン用のlibを開発していますが、私はまだ顔を始めています。ノードjsのスポーンを使って基本的なドッカー実行コマンドを試したところ - すべてうまくいきますが、以下のような複雑なケースでは機能しません。ノードjsのspawnで複雑なコマンドを実行するには?

私はnodejsでdocker run --rm -it julia:0.3.6 julia -E "[x^2 for x in 1:100]"を実行したいが、私はエラーの下getttingています -

入力デバイスは、コードの下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}`); 

    }); 

上記のスクリプトを実行する方法はありますか?

答えて

5

Dockerに-t--tty)フラグを渡しています。これは、入力と出力を端末(TTY)に接続する必要があることを示しています。ただし、spawnを使用している場合は、プログラムのNode.jsストリームに接続します。 Dockerはこれに気づき、エラーInput device is not a TTYを返します。したがって、この場合は-tフラグを使用しないでください。


最後の引数には、ネストした引用符を使用する必要はありません。"\" [x^2 for x in 1:100]\""引用符の目的は、シェルで実行しているときに引数にスペースやその他の特殊文字を保存することですが、spawnを使用するときはシェルを使用していません。

だからあなたの文のようなものでなければなりません:私はこれをしようとしていますが、 `コンテナプロセスを開始するばかり

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

は「幹部:\」原因 - E \「:$ PATHに見つからない実行ファイル」のための'上記のコマンド。 – irobo

+0

@Samそれはイメージ名の直後にあるものがコマンド名でなければならないからです(コマンド引数はイメージ名の直後にあります)。 '' julia:0.3.6 "'と '' -E "'の間にコマンド名 '' julia "'を追加するだけでいいはずです。私はこれを反映するために私の答えでコマンドを更新しました。 – Frxstrem

関連する問題