如何使用docker-py(docker SDK)将文件从主机复制到容器

bakd9h0s  于 2023-04-11  发布在  Docker
关注(0)|答案(3)|浏览(133)

我知道有一种可能的方法可以使用docker cp在主机和docker容器之间双向复制文件,也可以使用docker-py从运行的容器中获取文件。但我无法弄清楚如何(或者如果可能的话)使用docker-py将文件从主机复制到正在运行的容器。你们有遇到过这样的问题吗?是否有可能这样做,或者我必须使用python os.system执行命令。我想避免这种解决方案。

rqdpfwrv

rqdpfwrv1#

类似这样的东西应该可以工作:

import os
import tarfile
import docker

client = docker.from_env()

def copy_to(src, dst):
    name, dst = dst.split(':')
    container = client.containers.get(name)

    os.chdir(os.path.dirname(src))
    srcname = os.path.basename(src)
    tar = tarfile.open(src + '.tar', mode='w')
    try:
        tar.add(srcname)
    finally:
        tar.close()

    data = open(src + '.tar', 'rb').read()
    container.put_archive(os.path.dirname(dst), data)

然后像这样使用它:

copy_to('/local/foo.txt', 'my-container:/tmp/foo.txt')
lnlaulya

lnlaulya2#

使用内存BytesIO的代码段:

def copy_to_container(container: 'Container', src: str, dst_dir: str):
    """ src shall be an absolute path """
    stream = io.BytesIO()
    with tarfile.open(fileobj=stream, mode='w|') as tar, open(src, 'rb') as f:
        info = tar.gettarinfo(fileobj=f)
        info.name = os.path.basename(src)
        tar.addfile(info, f)

    container.put_archive(dst_dir, stream.getvalue())
gwo2fgha

gwo2fgha3#

#!/usr/bin/python

import os
import tarfile
import docker

client = docker.from_env()

def copy_to(src, dst):
    name, dst = dst.split(':')
    container = client.containers.get(name)

    os.chdir(os.path.dirname(src))
    srcname = os.path.basename(src)
    tar = tarfile.open(srcname + '.tar', mode='w')
    obj=os.walk(srcname)
    for items in obj:
        for files in items[2]:
            if files[-4::] == ".csv" :
                abs_path = items[0] + "/" + files
                tar.add(abs_path)

    tar.close()
    data = open(srcname + '.tar', 'rb')
    container.put_archive(dst, data)
    data.close()

copy_to('source_directory', 'container_name:destination_directory')

相关问题