我知道用 docker cp
可以在主机和 Docker 容器之间进行双向文件复制,并且可以使用 docker-py 从运行中的容器获取文件。但是,我无法想象如何(或者是否可能)使用 docker-py 将文件从主机复制到正在运行的容器中。
你们有没有遇到这样的问题?能否实现或者必须使用 Python 的 os.system
命令来执行?我希望避免使用后一种解决方案。
我知道用 docker cp
可以在主机和 Docker 容器之间进行双向文件复制,并且可以使用 docker-py 从运行中的容器获取文件。但是,我无法想象如何(或者是否可能)使用 docker-py 将文件从主机复制到正在运行的容器中。
你们有没有遇到这样的问题?能否实现或者必须使用 Python 的 os.system
命令来执行?我希望避免使用后一种解决方案。
这样做应该可以:
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')
使用内存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())
tar.add(src,arcname = os.path.basename(src))
来简化这个过程,而不是打开文件,创建tarinfo并添加文件对象。 - Manuel Jacob#!/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')
put_archive
做一些有趣的事情。https://docker-py.readthedocs.io/en/stable/containers.html#docker.models.containers.Container.put_archive - Oluwafemi Sule