Как исправить ReadError из Docker get_archive API - PullRequest
0 голосов
/ 30 марта 2019

Мне нужно скопировать файл или каталог из контейнера Docker на хост. Я использую docker-py для программного взаимодействия с Docker.

В очень упрощенной версии код Python выглядит следующим образом.

Я взял приведенный ниже код из StackOverflow и пробовал разные версии кода для get_archive. Ниже код работает только для файла, но не для каталога. Также он добавляет некоторые специальные символы в начале и конце файла.

def copy_from_container(container, src_dir, src_file):
  strm,status = container.get_archive('/var/log/')
  with open(src_file, 'w') as outfile:
    for d in strm:
      outfile.write(d)

Я прочитал другой поток в Stackoverflow, в котором говорится о вышеуказанных проблемах и, наконец, использовал приведенный ниже код.

def copy_from_container(container, src_dir, src_file):
  strm,status = container.get_archive('/var/log/')
  with open(src_file, 'w') as outfile:
    for d in strm:
      outfile.write(d)

Тем не менее, я закончил с ошибкой ниже.

/usr/lib/python2.7/tarfile.py:187: UnicodeWarning: Unicode unequal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
  if s[0] != chr(0200):
Traceback (most recent call last):
  File "c_copy_file.py", line 45, in <module>
    copy_from_container(container, src_dir, src_file)
  File "/root/c_container.py", line 72, in copy_from_container
    pw_tar.extractall("./")
  File "/usr/lib/python2.7/tarfile.py", line 2079, in extractall
    self.extract(tarinfo, path)
  File "/usr/lib/python2.7/tarfile.py", line 2116, in extract
    self._extract_member(tarinfo, os.path.join(path, tarinfo.name))
  File "/usr/lib/python2.7/tarfile.py", line 2192, in _extract_member
    self.makefile(tarinfo, targetpath)
  File "/usr/lib/python2.7/tarfile.py", line 2233, in makefile
    copyfileobj(source, target)
  File "/usr/lib/python2.7/tarfile.py", line 266, in copyfileobj
    shutil.copyfileobj(src, dst)
  File "/usr/lib/python2.7/shutil.py", line 49, in copyfileobj
    buf = fsrc.read(length)
  File "/usr/lib/python2.7/tarfile.py", line 831, in read
    buf += self.fileobj.read(size - len(buf))
  File "/usr/lib/python2.7/tarfile.py", line 743, in read
    return self.readnormal(size)
  File "/usr/lib/python2.7/tarfile.py", line 758, in readnormal
    return self.__read(size)
  File "/usr/lib/python2.7/tarfile.py", line 750, in __read
    raise ReadError("unexpected end of data")
tarfile.ReadError: unexpected end of data

Нужна помощь в понимании этой ошибки и идея о том, как ее исправить и двигаться вперед.

...