【问题标题】:Docker python client API copyDocker python客户端API拷贝
【发布时间】:2014-03-27 09:35:12
【问题描述】:

我正在使用 Docker python 客户端 API“复制”。 来自副本的响应类型为requests.packages.urllib3.HTTPResponse

是否需要针对不同类型的文件进行不同的处理?

我从容器中复制了一个文本文件,但是当我尝试使用 response.read() 我得到混合二进制数据的文本数据。 我将内容解码器视为

>>>resonse.CONTENT_DECODERS
>>>['gzip', 'deflate']

处理/读取/转储来自复制 API 的响应的最佳方法是什么?

【问题讨论】:

    标签: python rest gzip docker deflate


    【解决方案1】:

    来自 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()
    

    应修改代码以适用于文件夹。

    【讨论】:

    • 多谢提及,Docker Remote API 还是不知道。
    【解决方案2】:

    这里我的 python 3 版本带有 docker API 1.38,copy API 似乎被 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'])
    

    【讨论】:

      【解决方案3】:

      调整@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())
      

      【讨论】:

        猜你喜欢
        • 2015-01-13
        • 2018-01-27
        • 2017-10-14
        • 2021-03-05
        • 1970-01-01
        • 2012-02-20
        • 2012-04-12
        • 2017-03-18
        • 2019-01-22
        相关资源
        最近更新 更多