在Python子进程中在docker中运行交互命令

问题描述:

当我在交互模式下使用docker run时,我能够运行我想测试一些python东西的命令。在Python子进程中在docker中运行交互命令

[email protected]:~# docker run -i -t dockerfile/python /bin/bash 
[ [email protected]:/data ]$ python -c "print 'hi there'" 
hi there 
[ [email protected]:/data ]$ exit 
exit 
[email protected]:~# 

我想用子模块,所以我写了蟒蛇自动化此此:

run_this = "print('hi')" 
random_name = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(20)) 
command = 'docker run -i -t --name="%s" dockerfile/python /bin/bash' % random_name 
subprocess.call([command],shell=True,stderr=subprocess.STDOUT) 
command = 'cat <<\'PYSTUFF\' | timeout 0.5 python | head -n 500000 \n%s\nPYSTUFF' % run_this 
output = subprocess.check_output([command],shell=True,stderr=subprocess.STDOUT) 
command = 'exit' 
subprocess.call([command],shell=True,stderr=subprocess.STDOUT) 
command = 'docker ps -a | grep "%s" | awk "{print $1}" | xargs --no-run-if-empty docker rm -f' % random_name 
subprocess.call([command],shell=True,stderr=subprocess.STDOUT) 

据说这是为了创建容器,运行容器和出口蟒命令和删除容器。它执行所有这些操作,除了命令在主机上运行而不是在Docker容器上运行。我猜Docker正在换壳或类似的东西。如何从新的shell运行python子进程?

实际上,你需要生成的新的外壳你是opening.So一个新的子后docker creation运行docker enter或尝试用pexpect代替subprocess.`pexpect产生一个新的孩子,这样就可以发送指令相同的操作。

它看起来像你期待第二个命令cat <<...发送输入到第一个命令。但是这两个子进程命令没有任何关系,所以这是行不通的。

Python的subprocess library和作为其基础的popen命令提供了一种方法来获取管道到进程的stdin。这样,你可以直接从Python发送你想要的命令,而不必试图让另一个子进程与它通信。

所以,像这样:

from subprocess import Popen, PIPE 

p = Popen("docker run -i -t --name="%s" dockerfile/python /bin/bash", stdin=PIPE) 
p.communicate("timeout 0.5 python | head -n 500000 \n" % run_this) 

(我不是一个Python的专家,在道歉的错误串形成从this answer改编。)