첨부 된 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()
귀하의 구현에 혼란스러워합니다. '도커 로그'명령은 이미 얻은 것을 얻을 수있는 간단한 방법입니다. 명령 출력을 -v 옵션을 사용하여 호스트 환경에 매핑 된 파일로 파이프 할 수 있습니다. 그리고 왜 당신은 tty를 요구하고 있습니까? – Bryan
Dockerode, Node.js 패키지를 통해이 작업을 수행하므로 명령 줄을 사용하는 것이 쉽지만 프로그래밍 방식으로이 작업을 수행하려고합니다. – webjay