【问题标题】:How to copy a file from host to container using docker-py (docker SDK)如何使用 docker-py (docker SDK) 将文件从主机复制到容器
【发布时间】:2018-03-05 13:03:04
【问题描述】:

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

【问题讨论】:

标签: python docker docker-container dockerpy


【解决方案1】:

这样的事情应该可以工作:

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')

【讨论】:

  • put_archive 之后如何提取容器中的存档?
  • 容器中put_archive后的文件名是什么?
【解决方案2】:

使用内存BytesIO的代码sn-p:

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

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 2017-02-21
    • 2014-05-19
    • 1970-01-01
    • 2020-01-03
    • 2015-07-08
    相关资源
    最近更新 更多