docker - 从连接的Docker容器捕获输出

标签 docker

我试图捕获在附加的Docker容器上运行的命令的输出,但是我不知道如何仅从ls这样的命令获取输出。

下面的代码产生了这一点:

[[<root@098c455d93ff:/# 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()

最佳答案

如果它是日志记录功能,那么我想用一些示例编写这个要点。
https://gist.github.com/afolarin/a2ac14231d9079920864

如果正在使用v1.3,则可能要考虑的另一件事是docker exec命令,可用于将新进程插入正在运行的容器中。

关于docker - 从连接的Docker容器捕获输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26793948/

相关文章:

Docker 本地与远程缓存 (--cache-from)

docker - Kubernetes Volumes/PV与Docker命名卷

docker - 我可以在Docker的终端中读取文件时如何在Finder中查找文件

docker - 从 docker 镜像中删除环境变量

docker - 我将如何设置kubernetes服务和Pod的IP地址和端口以将一些信息发送到Pod中?

security - 使用 Jenkins 构建在 Docker 容器内运行的 Docker 镜像

sql-server - Macbook Pro 上的 Azure Data Studio 服务器连接错误

python - Heroku 发布阶段命令未执行

docker 容器中的 mysql 挂起

docker - 为什么卷映射不起作用?