Как скопировать файл с хоста в контейнер с помощью docker-py (docker SDK)

Я знаю, что есть возможный способ двунаправленного копирования файла между хостом и контейнером докеров с помощью docker cp, а также можно получить файл из запущенного контейнера с помощью docker-py. Но я не могу понять, как (или возможно ли вообще) скопировать файл с хоста в работающий контейнер с помощью docker-py. Ребята, есть ли у вас опыт решения такой проблемы? Возможно ли это сделать или мне нужно выполнить команду, используя python os.system. Я хотел бы избежать этого решения.


person s.t.e.a.l.t.h    schedule 24.09.2017    source источник
comment
Вы можете делать интересные вещи с put_archive. docker-py.readthedocs.io/ ru/стабильный/   -  person Oluwafemi Sule    schedule 24.09.2017
comment
Спасибо, я пропустил эту опцию в SDK, я был нацелен на копирование. Я собираюсь попробовать это   -  person s.t.e.a.l.t.h    schedule 24.09.2017
comment
Любое обновление здесь? Я пытаюсь скопировать файлы на локальную машину в контейнер докеров   -  person Michael Ababio    schedule 31.01.2018
comment
посмотрите ответы здесь... stackoverflow.com/a/59743346/6420513   -  person John Drinane    schedule 16.01.2020


Ответы (2)


Что-то вроде этого должно работать:

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')
person Yani    schedule 09.10.2018
comment
Как извлечь архив в контейнер после put_archive? - person Malar Kandasamy; 28.03.2021
comment
Какое имя файла после put_archive в контейнере? - person Malar Kandasamy; 28.03.2021

Фрагмент кода с использованием памяти 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())
person Yuan HOng    schedule 29.05.2021