docker_node.py 文件源码

python
阅读 18 收藏 0 点赞 0 评论 0

项目:ntf 作者: p4lang 项目源码 文件源码
def startShell(self, mnopts=None):
        self.stop()

        args = ['docker', 'run', '-ti', '--rm', '--privileged=true']
        args.extend(['--hostname=' + self.name, '--name=' + self.name])
        args.extend(['-e', 'DISPLAY'])
        args.extend(['-v', '/tmp/.X11-unix:/tmp/.X11-unix:ro'])
        print self.port_map
        if self.port_map is not None:
            for p in self.port_map:
                args.extend(['-p', '%d:%d' % (p[0], p[1])])
        if self.fs_map is not None:
            for f in self.fs_map:
                args.extend(['-v', '%s:%s' % (f[0], f[1])])
        args.extend([self.docker_image])

        master, slave = pty.openpty()
        self.shell = subprocess.Popen(
            args,
            stdin=slave,
            stdout=slave,
            stderr=slave,
            close_fds=True,
            preexec_fn=os.setpgrp)
        os.close(slave)
        ttyobj = os.fdopen(master, 'rw')
        self.stdin = ttyobj
        self.stdout = ttyobj
        self.pid = self.shell.pid
        self.pollOut = select.poll()
        self.pollOut.register(self.stdout)
        self.outToNode[self.stdout.fileno()] = self
        self.inToNode[self.stdin.fileno()] = self
        self.execed = False
        self.lastCmd = None
        self.lastPid = None
        self.readbuf = ''
        self.waiting = False

        # Wait for prompt
        time.sleep(1)

        pid_cmd = ['docker', 'inspect', '--format=\'{{ .State.Pid }}\'',
                   self.name]
        pidp = subprocess.Popen(
            pid_cmd,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            close_fds=False)
        pidp.wait()
        ps_out = pidp.stdout.readlines()
        self.pid = int(ps_out[0])
        self.cmd('export PS1=\"\\177\"; printf "\\177"')
        self.cmd('stty -echo; set +m')
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号