1

我正在按照此链接中给出的 get_archive()链接的说明进行操作, 但我没有创建我的容器,而是尝试使用在我的情况下已经运行的容器“docker-nginx”作为输入字符串以及我的内容所在的目标文件夹在 nginx 服务器中作为 '/usr/share/nginx/html' 并获得了文件夹统计信息的输出 我无法弄清楚我的文件是在哪里下载的

这是我的代码 strm,stat=c.get_archive(container_name,'/usr/share/nginx/html')

我的 print(strm) 输出是<requests.packages.urllib3.response.HTTPResponse object at 0x7fe3581e1250> 我的 print(stat) 输出是{u'linkTarget': u'', u'mode': 2147484157, u'mtime': u'2016-10-05T09:37:17.928258508-05:00', u'name': u'html', u'size': 4096}

4

3 回答 3

1

上面的答案部分正确。如果您直接编写 tar 流,它会写入额外的未知元数据参数。

为了只写内容,请使用以下内容,

from io import StringIO
strm,status = container.get_archive("container_path/")
for d in strm:
   pw_tar = tarfile.TarFile(fileobj=StringIO(d.decode('utf-8')))
   pw_tar.extractall("extract_to/")

文件夹或文件可以从流中提取。

于 2018-06-20T12:41:41.213 回答
1

答案取决于您使用的 docker sdk 版本。

对于docker3.X 之前的 sdk 版本

get_archive返回一个类似文件的流。因此,用于shutil.copyfileobj将数据流式传输到文件:

import shutil

strm, stat = container.get_archive(container_name, path_in_container)
with open('out.html', 'w') as outfile:
    shutil.copyfileobj(strm, outfile)

对于dockerSDK 3.X+

get_archive返回文件内容的迭代器,因此只需迭代并写入:

strm, stat = container.get_archive(container_name, path_in_container)
with open('out.html', 'w') as outfile:
    for d in strm:
        outfile.write(d)
于 2018-03-05T19:50:23.227 回答
0

我发现了这个函数是如何工作的,它返回对我们容器的请求的原始响应。可以在此链接 中找到原始响应说明,以便提取原始内容,我们可以使用此代码,以便我们可以根据我的案例 html 中的输出文件简单地将原始数据读取为文本格式。

raw_data=strm.read()
f= open('out.html', 'w')
f.write(raw_data)
于 2016-10-08T21:33:59.573 回答