2014-11-07 4 views
0

첨부 된 Docker 컨테이너에서 실행되는 명령의 출력을 캡처하려고 시도하지만 ls과 같은 명령의 출력을 얻는 방법을 알 수 없습니다.첨부 된 도커 컨테이너의 출력 캡처

아래 코드는이 생산 :

[[<[email protected]:/# ls; ><echo 1987a><6ee-2aad-4713-831a-f8102bfde4b7 $? 
><bin dev home lib64 mnt proc run srv tmp var 
boot etc lib media opt root sbin sys usr 
>]] 

내가 얻으려고 노력하고있는 반면에만이 :

[[<bin dev home lib64 mnt proc run srv tmp var 
boot etc lib media opt root sbin sys usr 
>]] 

코드 :

'use strict' 

Docker = require 'dockerode' 
uuid = require 'node-uuid' 
async = require 'async' 
os = require 'os' 
fs = require 'fs' 

class Make 

    d: new Docker 
    host: '192.168.59.103' 
    protocol: 'https' 
    port: 2376 
    ca: fs.readFileSync(process.env.DOCKER_CERT_PATH + '/ca.pem') 
    cert: fs.readFileSync(process.env.DOCKER_CERT_PATH + '/cert.pem') 
    key: fs.readFileSync(process.env.DOCKER_CERT_PATH + '/key.pem') 

    output: '' 

    run: (cmd, callback) -> 
    pid = uuid.v4() 
    command = cmd + '; echo ' + pid + ' $?' + os.EOL 
    @stream.on 'readable', => 
     data = @stream.read() 
     # console.log data 
     # look for exit code 
     matchExit = data.match /(^[A-Za-z0-9-]{36})\s(\d+)$/m 
     if matchExit isnt null and matchExit[1] is pid 
     if matchExit[2] isnt '0' 
      console.error 'Exit code: %d: %s', matchExit[2], command 
     @stream.removeAllListeners 'readable' 
     return callback() 
     # look for command output 
     matchOutput = data.match /([A-Za-z0-9-]{36})/ 
     if matchOutput is null 
     @output += '<' + data + '>' 
    @stream.write command 

    setup: (callback) -> 
    async.series [ 
     # create 
     (callback) => 
     options = 
      Image: 'ubuntu' 
      Tty: true 
      # AttachStdin: true 
      # AttachStdout: true 
      AttachStderr: true 
      OpenStdin: true 
      # StdinOnce: false 
     @d.createContainer options, (err, @container) => 
      callback err 
     # attach 
     , (callback) => 
     options = 
      stream: true 
      stdin: true 
      stdout: true 
      stderr: true 
     @container.attach options, (err, @stream) => 
      return callback err if err? 
      @stream.setEncoding 'utf8' 
      callback() 
     # start 
     , (callback) => 
     @container.start callback 
    ], callback 

    build: (callback) -> 
    cmds = [ 
     'ls' 
     # 'mkdir test' 
     # 'cd test' 
     # 'echo "hello world" > hello.txt' 
     # 'cat hello.txt' 
    ] 
    runner = (cmd, callback) => @run cmd, callback 
    async.eachSeries cmds, runner, callback 


make = new Make() 

make.setup (err) -> 
    console.error err if err? 
    make.build -> 
    console.log '[[' + make.output + ']]' 
    make.stream.end() 
+1

귀하의 구현에 혼란스러워합니다. '도커 로그'명령은 이미 얻은 것을 얻을 수있는 간단한 방법입니다. 명령 출력을 -v 옵션을 사용하여 호스트 환경에 매핑 된 파일로 파이프 할 수 있습니다. 그리고 왜 당신은 tty를 요구하고 있습니까? – Bryan

+0

Dockerode, Node.js 패키지를 통해이 작업을 수행하므로 명령 줄을 사용하는 것이 쉽지만 프로그래밍 방식으로이 작업을 수행하려고합니다. – webjay

답변

0

당신이 원하는 loging 기능이있는 경우 나는 몇 가지 예를 들어이 요지를 썼다. https://gist.github.com/afolarin/a2ac14231d9079920864

v1.3을 사용하는 경우 고려해야 할 다른 사항은 실행중인 컨테이너에 새 프로세스를 삽입하는 데 사용할 수있는 docker exec 명령입니다.

+0

container.exec가 좋게 보입니다.이 질문은 잘못된 장소 일 수 있습니다. 그러나 명령 오류가 있으면 '$?'를 캡처하려고합니다. – webjay

+0

내 요점을보세요. 도커 로그를 분리 할 수 ​​있습니다. 'me @ host ~ $ 도커 로그 foo> stdout.log 2> stderr.log .... 다음 .... me @ host ~ $ cat stdout.log .... 다음 .... me @ host ~ $ cat stderr.log' –

관련 문제