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')
评论列表
文章目录