本篇博客将介绍在使用docker API时,如何监管container的PTY实现交互
问题引入
docker官方已经提供了API用来管理client,container,image,network等,基本的操作覆盖了docker CLI相关功能,但docker的API现在只能使用exec_run来执行一条命令,中间无法进行交互,希望能有一个类似于-it
的方式来完成交互操作。
经过几天的学习和测试,发现其实docker的containers.run()
和containers.exec_run()
都是可以设置stdin=True
, tty=True
。但开启这些之后,将返回一个socket,需要自己来进行处理。
google大法后,找到了一个dockerpty的python lib,可以完成这件事情
环境搭建
根据dockerpty的github上提到的安装过程,只需要pip install dockerpty
即可完成安装。
但源码已经有两年没有更新了,该版本无法在新的docker API上正常工作
fork了工程后,对其中的代码涉及到的docker API进行更新后,测试可以正常工作,最新的代码已经上传到git上simble1986/dockerpty
依赖
原有的project上提到依赖的docker api为docker-py>=0.3.2
,但docker的python API已经更新
- 安装docker API
1 | pip install docker |
安装步骤
- 获取源码
1 | git clone https://github.com/simble1986/dockerpty.git |
- 安装
1 | $ pip uninstall dockerpty |
相关API
参看docker官方API文档,以下主要对container相关参数加以说明
- tty (bool) – Allocate a pseudo-TTY.
- stdin_open (bool) – Keep STDIN open even if not attached.
基本使用
- 连接client
1 | root@slt-docker:/home/bqi# python |
注: 支持远程API
- 创建container
1 | "ubuntu","/bin/bash",tty=True,stdin_open=True) test1 = client.containers.create( |
- 使用dockerpty
1 | dockerpty.start(client,test1) |