Задать вопрос
chuikoffru
@chuikoffru
Full Stack JS Developer

Как добавить Dockerfile в существующий .tar архив с помощью python tarfile?

Добрый день!

Хочу добавить Dockerfile в архив tar, используя стандартную утилиту tarfile из Python, но получаю ошибку
BaseException: invalid header в случае если ставлю mode = "a". Если ставлю mode = "w", то все норм, файл добавляется, но как вы понимаете все остальное стирается.

Мой код:
def insert_dockerfile_to_tarfile(file_path: str, dockerfile: str):
  string = dockerfile.encode('utf-8')
  tarinfo = tarfile.TarInfo(name="Dockerfile")
  data = io.BytesIO(string)
  tarinfo.size = data.getbuffer().nbytes
  tarinfo.type = tarfile.REGTYPE
  
  try:
    with tarfile.open(file_path, "a") as tar:
      tar.addfile(tarinfo = tarinfo, fileobj=data)
  except Exception as e:
    raise BaseException(str(e))


Тесты на pytest падают при запуске:

full_path = "./archive.tar"

dockerfile = """
FROM nginx:stable-alpine
WORKDIR /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
"""
def test_insert_dockerfile_to_tarfile():
  # Удаляем Dockerfile
  remove_dockerfile()
  # Проверяем отсутствие Dockerfile
  assert check_dockerfile() == False
  # Добавляем новый Dockerfile с помощью тестируемой функции
  insert_dockerfile_to_tarfile(full_path, dockerfile)
  # Проверяем наличие Dockerfile
  assert check_dockerfile() == True
  • Вопрос задан
  • 26 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
gnifajio
@gnifajio
Совершенствуюсь каждый день
Для добавления файла Dockerfile в существующий .tar архив с помощью модуля tarfile в Python можно использовать следующий код:

import tarfile

# Открываем существующий .tar архив в режиме добавления файлов
with tarfile.open('existing_archive.tar', mode='a') as tar:
  # Добавляем файл Dockerfile в архив
  tar.add('Dockerfile')

Также можно указать имя, под которым будет сохранен файл в архиве, используя аргумент arcname:

import tarfile

with tarfile.open('existing_archive.tar', mode='a') as tar:
  tar.add('Dockerfile', arcname='custom_name.txt')

Обратите внимание, что указанный код открывает архив в режиме добавления файлов (mode='a'). Если вы хотите открыть архив в режиме чтения (mode='r'), то не сможете добавить файлы в него. Также существует режим создания нового архива (mode='w'), который перезапишет существующий файл, если такой будет существовать.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы