現在、dockerを勉強中です。その中で、node.jsを使ったソースコードチェックツールを作っています。
どうしてもエラーで引っかかってしまい、なかなか前に進めず困っています。
Error response from daemon: lstat /var/lib/docker/aufs/mnt/8f92a5e8bdb2067a54835a8dae1fa4549900c6406330ad1e7627e7bbb14a3264/time.txt: no such file or directory child_process.js:526 throw err; ^ Error: Command failed: docker cp 4f03ce86b007:/time.txt /tmp/time.txt Error response from daemon: lstat /var/lib/docker/aufs/mnt/8f92a5e8bdb2067a54835a8dae1fa4549900c6406330ad1e7627e7bbb14a3264/time.txt: no such file or directory
動かすnode.jsで書いたapp.js
//モジュールの読み込み var express = require('express'); var app = express(); var bodyParser = require('body-parser'); var child_process = require('child_process'); var fs = require('fs'); //app.use()で使うミドルウェアを設定。 //ミドルウェアとは? //オペレーティングシステム(OS)とアプリケーションソフトの中間に位置し、様々なソフトウェアから共通して利用される機能を提供するもの //Expreeミドルウェアでは、HTTP要求や応答の前後に処理を追加することが可能。 //publicディレクトリをプラウザで利用する静的ファイルの起き場所として利用 //URLEncodeを行う。 app.use(express.static('public')); app.use(bodyParser.urlencoded({extended: false})); //API:POST app.post('/api/run',function(req,res){ var language = req.body.language; var source_code = req.body.source_code; var input = req.body.input; var filename, execCmd; if(language === 'ruby'){ filename = 'Main.rb'; execCmd = 'ruby Main.rb' }else if(language == 'python'){ filename = 'Main.py'; execCmd = 'ruby Main.py' } //コンテナ作成 //-iで標準入出力を有効。ネットワーク機能が不要。CPUは1CPUコアのみ。CPUコアの0番を利用。 //メモリも物理メモリも512MBスワップなし。プロセス数の制御。 var dockerCmd = 'docker create -i --net none --cpuset-cpus 0 --memory 512m --memory-swap 512m '+ '--ulimit nproc=10:10 --ulimit fsize=1000000 -w /workspace ubuntu-dev ' + '/usr/bin/time -q -f "%e" -o /time/txt timeout 3 su nobody -s /bin/bash -c "' + execCmd + '"'; console.log("Runing: "+ dockerCmd); var containerId = child_process.execSync(dockerCmd).toString().substr(0,12); console.log("ContainerId: "+ containerId) //コードをコンテナにコピーする child_process.execSync('rm -rf /tmp/workspace && mkdir /tmp/workspace && chmod 777 /tmp/workspace') fs.writeFileSync('/tmp/workspace/'+ filename, source_code); dockerCmd = "docker cp /tmp/workspace " + containerId + ":/"; console.log("Running: "+ dockerCmd); child_process.execSync(dockerCmd); //コンテナ開始 dockerCmd = "docker start -i " + containerId; console.log("Running: "+dockerCmd); var child = child_process.exec(dockerCmd,{},function(error,stdout,stderr){ //結果をコピーする dockerCmd = "docker cp "+containerId + ":/time.txt /tmp/time.txt"; console.log("Running: "+dockerCmd); child_process.execSync(dockerCmd); var time = fs.readFileSync("/tmp/time.txt").toString(); //コンテナから削除 dockerCmd = "docker rm "+ containerId; console.log("Running: "+dockerCmd); child_process.execSync(dockerCmd); console.log("Result: ",error,stdout,stderr); res.send({ stdout: stdout, stderr: stderr, exit_code: error && error.code || 0, time:time, }); }); child.stdin.write(input); child.stdin.end(); }); app.listen(3000,function(){ console.log('Listening on port 3000') });
どうしてか結果をコピーするところで意図していないファイルを見てしまいます。
もし分かる方いたら教えてください。
お願いします。
回答1件
あなたの回答
tips
プレビュー