Docker Python客户端API复制

2 投票
3 回答
2409 浏览
提问于 2025-04-18 00:07

我正在使用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()

这个代码需要修改一下,才能在文件夹上使用。

撰写回答