概要
通常、コマンドラインから docker run -it centos
とタイプして実行すると、新たなdockerコンテナが作成されその中でプロンプトが出、入力待ち状態になります。
これを Node.js から実行させるようなコマンドラインツールを作成中です。(イメージは node tool.js --centos-cli
みたいな感じ)
単純に、Node.jsの処理を終えて上記の docker
コマンドへ処理を移行したいだけなので、ラクショーかと思っていたのですが、一向に実現できません・・。
##確認環境
- Windows 10 Pro
- Docker CommunityEdition (Engine: 18.03.1-ce) ※Hyper-V
- Node.js v8.9.2
やったこと/考察
まずは以下のように exec()
で書いてみました。
js
1const child = require('child_process') 2child.exec('docker run -it centos')
ところが、何も起きません。docker コンテナも作られません。
処理を待った方がいいのかなと思い exec()
→ execSync()
に替えたところ、今度は the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
というエラーメッセージが表示されました。
いろいろ検索していたところ、海外の質問サイトで外部コマンドでPDFファイルを開きたい旨の投稿を見つけたので、参考にして以下のコードを書きました。 exec()
ではなく spawn()
を使っています。
How to detach a spawned child process in a Node.js script?
js
1const child = require('child_process'); 2let cp = child.spawn('docker', ['run', '-it', 'centos'], { 3 detached: true, 4 stdio: 'ignore' 5}) 6cp.unref();
結果は、 exec()
と同様、なにも起きず、コンテナも作成されずに終了してしまいます。
同様に spawn()
→ spawnSync()
にすると、unref()
が関数ではないというエラーが出ました。
##お願いします
いろいろやってわかったのは、child.exec('start https://google.com')
など、実行してすぐ終わるようものなら正常に動くのですが、インタラクティブに入出力を受け付けるようなコマンドはうまく動かないということでした。
このへんを見てTTY自体を実装しないといけないということなんでしょうかね・・?
単純に Node.js 終了させて docker コマンドを実行したいだけなんですが・・。
何か方法がございましたらお知恵を拝借したく存じます。
よろしくお願いします。
m(_ _)m
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/07 08:44
2018/05/07 08:46
2018/05/07 08:56