python 如何使用docker-py中的copy将文件从容器复制到主机

j8ag8udp  于 2023-02-07  发布在  Python
关注(0)|答案(3)|浏览(283)

我正在使用docker-py。我想从docker容器复制一个文件到主机。
来自docker-py文档:

copy

Identical to the docker cp command. Get files/folders from the container.

Params:

    container (str): The container to copy from
    resource (str): The path within the container

Returns (str): The contents of the file as a string

我可以创建container并启动它,但无法获取从container复制到主机的文件。有人能帮我指出我是否丢失了什么吗?我的docker container中有/mydir/myshell.sh,我试图将其复制到主机。

>>> a = c.copy(container="7eb334c512c57d37e38161ab7aad014ebaf6a622e4b8c868d7a666e1d855d217", resource="/mydir/myshell.sh") >>> a
<requests.packages.urllib3.response.HTTPResponse object at 0x7f2f2aa57050>
>>> type(a)
<class 'requests.packages.urllib3.response.HTTPResponse'>

如果有人能帮我弄清楚它是在复制还是甚至没有复制文件,那将会很有帮助。

tkclm6bt

tkclm6bt1#

copy在docker中是一个被弃用的方法,首选的方法是使用put_archive方法。所以基本上我们需要创建一个归档文件,然后将其放入容器中。我知道这听起来很奇怪,但这是API目前支持的。如果你像我一样,认为这可以改进,请随时打开一个问题/功能请求,我会投赞成票。
下面是有关如何将文件复制到容器的代码片段:

def copy_to_container(container_id, artifact_file):
    with create_archive(artifact_file) as archive:
        cli.put_archive(container=container_id, path='/tmp', data=archive)

def create_archive(artifact_file):
    pw_tarstream = BytesIO()
    pw_tar = tarfile.TarFile(fileobj=pw_tarstream, mode='w')
    file_data = open(artifact_file, 'r').read()
    tarinfo = tarfile.TarInfo(name=artifact_file)
    tarinfo.size = len(file_data)
    tarinfo.mtime = time.time()
    # tarinfo.mode = 0600
    pw_tar.addfile(tarinfo, BytesIO(file_data))
    pw_tar.close()
    pw_tarstream.seek(0)
    return pw_tarstream
yizd12fk

yizd12fk2#

在我的python脚本中,我添加了一个调用来使用docker run -it -v artifacts:/artifacts target-build运行docker,这样我就可以在artifacts文件夹中获取docker运行生成的文件。

ttcibm8c

ttcibm8c3#

此问题的当前首选答案描述了如何从主机复制到容器。
要从容器复制到主机,您可以使用文档中关于get_archive函数的类似方法:www.example.comhttps://docker-py.readthedocs.io/en/stable/containers.html#docker.models.containers.Container.get_archive
例如:

container = client.containers.get('your-container-name')

def copy_from_container(dest, src):
    f = open(dest, 'wb')
    bits, stat = container.get_archive(src)
    for chunk in bits:
        f.write(chunk)
    f.close()

copy_from_container('/path/to/host/desination.tar', '/container/source/location.sh')

这应该会将容器源文件保存到主机上的tar归档文件中。

相关问题