Вопрос или проблема
Что касается вопроса, я провел исследование и попробовал предложения из других обсуждений, но я все еще не уверен, как это сделать для моего случая.
Я запускаю контейнер и регулярно создаю резервные копии в виде 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" @-
Команда выше приведет к тому, что будут включены только эти файлы, потому что аргументы включения имеют приоритет над аргументами исключения.
Есть ли какие-либо предложения, как я могу это сделать?
Ответ или решение
Вопрос, который вы подняли, касается использования инструмента 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
, потребуется немного больше маневров и, возможно, создание временного каталога. Однако конечный результат позволит вам включить именно те файлы, которые критически важны для работы вашего контейнера после восстановления, и исключить всё остальное, что не нужно.
Удачи в ваших резервных копиях контейнеров!