bsdtar: Включите несколько конкретных директорий после исключения широкого шаблона.

Вопрос или проблема

Что касается вопроса, я провел исследование и попробовал предложения из других обсуждений, но я все еще не уверен, как это сделать для моего случая.

Я запускаю контейнер и регулярно создаю резервные копии в виде tar-файлов. Перенаправляя поток из docker export в stdout как stdin для bsdtar, я могу отфильтровать некоторые ненужные файлы и директории из tar-файла.

docker export $CONTAINER_ID | bsdtar -c --posix -f snapshot.tar \
--exclude=".cache" \
--exclude="Cache" @-

Но некоторые элементы кэша важны для ускорения импортированного контейнера, поэтому мне нужно включить их в мой tar-файл.

docker export $CONTAINER_ID | bsdtar -c --posix -f snapshot.tar \
--exclude=".cache" \
--exclude="Cache" 
--include="some-important-files/.xyz" @-

Команда выше приведет к тому, что будут включены только эти файлы, потому что аргументы включения имеют приоритет над аргументами исключения.

Есть ли какие-либо предложения, как я могу это сделать?


  1. Исключить файлы, кроме конкретного в tar – Unix & Linux Stack Exchange
  2. контейнеры – Исключить директорию из podman/docker export потока и сохранить в файл – Stack Overflow

Ответ или решение

Вопрос, который вы подняли, касается использования инструмента bsdtar для создания резервных копий контейнеров Docker с исключением определенных каталогов и файлов, но при этом с включением важных элементов, таких как кэш. Это довольно распространенная задача, и понимание приоритетов --exclude и --include в bsdtar является ключом к ее решению.

Основные принципы работы с bsdtar

При использовании bsdtar важно учитывать, что опции --exclude и --include имеют строгий порядок обработки. Когда вы используете оба параметра, --include имеет приоритет над --exclude. Это значит, что если вы сначала укажете определение вхождения, то все остальные исключения будут проигнорированы для совпадающих файлов.

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

Решение проблемы

Метод 1: Использование переменных окружения

Мы можем воспользоваться тем, что вы имеете дело с Docker. Сначала мы можем создать временный каталог, в который будем копировать все файлы, а затем применять bsdtar. Это позволит нам контролировать, что мы исключаем и что мы включаем.

# Создание временного расположения
mkdir /tmp/docker_backup

# Копируем без исключений, чтобы не потерять важные файлы
docker export $CONTAINER_ID | bsdtar -C /tmp/docker_backup -xf -

# Удаляем нежелательные файлы и папки
rm -rf /tmp/docker_backup/.cache /tmp/docker_backup/Cache

# Включаем важные файлы обратно (если они были удалены)
cp /path/to/some-important-files/.xyz /tmp/docker_backup/some-important-files/

# Создаем архив
cd /tmp/docker_backup
bsdtar -c --posix -f snapshot.tar .

Этот подход требует больше шагов, чем задумывалось изначально, но он позволяет избежать проблем с конфликтами включения и исключения.

Метод 2: Более тонкие настройки с использованием регулярных выражений

Другим способом будет использование сложных регулярных выражений (если поддерживается bsdtar в вашей системе). Вы можете использовать -E для создания более специфичных шаблонов исключения и включения.

docker export $CONTAINER_ID | bsdtar -c --posix -f snapshot.tar \
--exclude=".cache" \
--exclude="Cache" \
--include="some-important-files/.xyz" \
--exclude="other-unwanted-files/" @-

Метод 2 может не сработать, если bsdtar не поддерживает сложные шаблоны.

Заключение

Резюмируя, для успешного решения вашей задачи с использованием bsdtar и docker export, потребуется немного больше маневров и, возможно, создание временного каталога. Однако конечный результат позволит вам включить именно те файлы, которые критически важны для работы вашего контейнера после восстановления, и исключить всё остальное, что не нужно.

Удачи в ваших резервных копиях контейнеров!

Оцените материал
Добавить комментарий

Капча загружается...