Docker Python客户端API复制
我正在使用Docker的Python客户端API中的'copy'功能。
从copy得到的响应是requests.packages.urllib3.HTTPResponse
类型。
不同类型的文件需要不同的处理方式吗?
我从容器中复制了一个文本文件,但当我尝试用response.read()
读取时,发现文本数据和二进制数据混在一起。
我看到内容解码器如下:
>>>resonse.CONTENT_DECODERS
>>>['gzip', 'deflate']
处理/读取/转储copy API的响应的最佳方法是什么?
3 个回答
1
调整一下@Apr的回答,以适应Python 3:
import tarfile, io, os
def copy_from_docker(client, container_id, src, dest):
reply = client.copy(container_id, src)
filelike = io.BytesIO(reply.read())
tar = tarfile.open(fileobj = filelike)
file = tar.extractfile(os.path.basename(src))
with open(dest, 'wb') as f:
f.write(file.read())
3
这是我用 Python 3 和 Docker API 1.38 写的版本,之前的 copy
接口似乎被 get_archive
替代了。
archive, stat = client.get_archive(path)
filelike = io.BytesIO(b"".join(b for b in archive))
tar = tarfile.open(fileobj=filelike)
fd = tar.extractfile(stat['name'])
6
从docker的API得到的回复是一个没有压缩的tar文件。我需要查看docker的源代码才能了解这个回复的格式,因为这个信息没有文档说明。比如,要下载一个位于remote_path
的文件,你需要这样做:
import tarfile, StringIO, os
reply = docker.copy(container, remote_path)
filelike = StringIO.StringIO(reply.read())
tar = tarfile.open(fileobj = filelike)
file = tar.extractfile(os.path.basename(remote_path))
print file.read()
这个代码需要修改一下,才能在文件夹上使用。