如何使用 Python 启动交互式 Docker 容器?
How do I use Python to launch an interactive Docker container?
我正在使用 Docker 图像,我在交互模式下启动它,如下所示:docker run -it --rm ubuntu bash
我使用的实际图像有很多复杂的参数,这就是为什么我编写了一个脚本来构建完整的 docker run
命令并为我启动它。随着逻辑变得越来越复杂,我想将脚本从 bash 迁移到 Python。
使用docker-py
,我准备了运行图像的一切。但是,似乎使用 docker.containers.run
进行交互式 shells 是 not supported。使用 subprocess
似乎合乎逻辑,所以我尝试了以下操作:
import subprocess
subprocess.Popen(['docker', 'run', '-it', '--rm', 'ubuntu', 'bash'])
但这给了我:
$ python3 docker_run_test.py
$ unable to setup input stream: unable to set IO streams as raw terminal: input/output error
$
请注意,错误消息出现在与 python 命令不同的 shell 提示中。
如何使 python3 docker_run_test.py
与 运行ning docker run -it --rm ubuntu bash
等效?
可以使用伪终端对容器进程进行读写
import pty
import sys
import select
import os
import subprocess
pty, tty = pty.openpty()
p = subprocess.Popen(['docker', 'run', '-it', '--rm', 'ubuntu', 'bash'], stdin=tty, stdout=tty, stderr=tty)
while p.poll() is None:
# Watch two files, STDIN of your Python process and the pseudo terminal
r, _, _ = select.select([sys.stdin, pty], [], [])
if sys.stdin in r:
input_from_your_terminal = os.read(sys.stdin.fileno(), 10240)
os.write(pty, input_from_your_terminal)
elif pty in r:
output_from_docker = os.read(pty, 10240)
os.write(sys.stdout.fileno(), output_from_docker)
我们可以用这个吗?
import os
os.system('docker run -it --rm ubuntu bash')
我正在使用 Docker 图像,我在交互模式下启动它,如下所示:docker run -it --rm ubuntu bash
我使用的实际图像有很多复杂的参数,这就是为什么我编写了一个脚本来构建完整的 docker run
命令并为我启动它。随着逻辑变得越来越复杂,我想将脚本从 bash 迁移到 Python。
使用docker-py
,我准备了运行图像的一切。但是,似乎使用 docker.containers.run
进行交互式 shells 是 not supported。使用 subprocess
似乎合乎逻辑,所以我尝试了以下操作:
import subprocess
subprocess.Popen(['docker', 'run', '-it', '--rm', 'ubuntu', 'bash'])
但这给了我:
$ python3 docker_run_test.py
$ unable to setup input stream: unable to set IO streams as raw terminal: input/output error
$
请注意,错误消息出现在与 python 命令不同的 shell 提示中。
如何使 python3 docker_run_test.py
与 运行ning docker run -it --rm ubuntu bash
等效?
可以使用伪终端对容器进程进行读写
import pty
import sys
import select
import os
import subprocess
pty, tty = pty.openpty()
p = subprocess.Popen(['docker', 'run', '-it', '--rm', 'ubuntu', 'bash'], stdin=tty, stdout=tty, stderr=tty)
while p.poll() is None:
# Watch two files, STDIN of your Python process and the pseudo terminal
r, _, _ = select.select([sys.stdin, pty], [], [])
if sys.stdin in r:
input_from_your_terminal = os.read(sys.stdin.fileno(), 10240)
os.write(pty, input_from_your_terminal)
elif pty in r:
output_from_docker = os.read(pty, 10240)
os.write(sys.stdout.fileno(), output_from_docker)
我们可以用这个吗?
import os
os.system('docker run -it --rm ubuntu bash')