0%

dockerpty使用

本篇博客将介绍在使用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
2
3
$ pip uninstall dockerpty
$ cd dockerpty
$ python setup.py install

相关API

参看docker官方API文档,以下主要对container相关参数加以说明

  • tty (bool) – Allocate a pseudo-TTY.
  • stdin_open (bool) – Keep STDIN open even if not attached.

基本使用

  • 连接client
1
2
3
4
5
6
7
root@slt-docker:/home/bqi# python
Python 2.7.12 (default, Dec 4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import docker
>>> import dockerpty
>>> client=docker.from_env()

: 支持远程API

  • 创建container
1
>>> test1 = client.containers.create("ubuntu","/bin/bash",tty=True,stdin_open=True)
  • 使用dockerpty
1
2
3
4
5
6
>>> dockerpty.start(client,test1)
root@d6ddcf619602:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@d6ddcf619602:/# exit
exit
>>>