Ошибка вида «file not found: /mnt/data/document.pdf» при обработке PDF в изолированной среде почти всегда означает одно: файл либо не был загружен в песочницу, либо скрипт обращается к нему по пути, которого внутри контейнера не существует. Каталог /mnt/data — это типовая точка монтирования пользовательских файлов в sandbox-окружениях: облачных блокнотах, контейнерах Docker, средах выполнения кода у ИИ-ассистентов и CI-системах.
Разберёмся, как устроена изолированная обработка PDF, почему именно /mnt/data стал стандартным расположением для загружаемых документов и что проверить, если скрипт не видит файл или падает с ошибкой доступа. Материал ориентирован на тех, кто запускает Python-скрипты для чтения, слияния или конвертации PDF внутри песочницы — будь то облачный ноутбук или локальный контейнер.
Что такое sandbox при работе с PDF
Песочница (sandbox) — это изолированная среда выполнения, в которой код работает с ограниченными правами: без доступа к основной файловой системе, сети или системным ресурсам хоста. Для PDF это особенно актуально, потому что формат исторически содержит активные элементы — JavaScript, встроенные шрифты, внешние ссылки, — и открытие недоверенного документа без изоляции считается риском.
На практике изоляция реализуется двумя разными способами. Первый — песочница просмотрщика: современные читалки PDF рендерят документ в процессе с пониженными привилегиями. Второй — контейнерная изоляция: скрипт обработки запускается в отдельном контейнере, куда файлы подкладываются через монтируемый том. Именно во втором сценарии и появляется путь /mnt/data.
Почему используется каталог /mnt/data
В Linux-системах каталог /mnt по соглашению предназначен для временно монтируемых файловых систем. Когда платформа запускает ваш код в контейнере, она подключает том с пользовательскими файлами именно туда — отсюда и путь /mnt/data. Сам контейнер при этом может быть полностью одноразовым: после завершения сессии всё, кроме смонтированного тома, удаляется.
Из этого следуют два практических вывода. Во-первых, всё, что скрипт сохранил вне /mnt/data (например, в /tmp или домашнем каталоге), с высокой вероятностью пропадёт после завершения сессии. Во-вторых, относительные пути вида document.pdf сработают только если рабочий каталог процесса совпадает с точкой монтирования — надёжнее указывать абсолютный путь.
from pathlib import Path
DATA_DIR = Path("/mnt/data")
pdf_path = DATA_DIR / "document.pdf"
if not pdf_path.exists():
raise FileNotFoundError(f"Файл не найден: {pdf_path}")
Типичные ошибки и их причины
Большинство проблем при работе с PDF в песочнице сводится к четырём сценариям. Их удобно проверять по порядку, от самого частого к редкому.
- 📄 FileNotFoundError — файл не загружен в среду или имя отличается: пробелы, кириллица и регистр букв внутри контейнера имеют значение;
- 🔒 PermissionError — том смонтирован в режиме «только чтение», поэтому запись результата в
/mnt/dataневозможна; - 🧩 ModuleNotFoundError — библиотека для работы с PDF (например, pypdf или PyMuPDF) не установлена в образе песочницы;
- 💾 MemoryError — контейнеру выделено мало памяти, а PDF содержит тяжёлые изображения или тысячи страниц.
⚠️ Внимание: если песочница монтирует каталог в режиме read-only, не пытайтесь обходить ограничение сменой прав через chmod — это либо не сработает, либо нарушит политику платформы. Сохраняйте результат в разрешённый каталог или скачивайте его через предусмотренный интерфейс.
Как правильно загрузить и прочитать PDF
Порядок действий зависит от платформы, но общая логика одинакова. Сначала файл нужно передать в среду — кнопкой загрузки в интерфейсе, через API или монтированием тома при запуске контейнера. Затем убедитесь, что он действительно появился в /mnt/data, и только после этого запускайте обработку.
☑️ Проверка перед обработкой PDF в песочнице
Для локального запуска в Docker монтирование выглядит примерно так — флаг -v связывает папку на хосте с каталогом внутри контейнера:
docker run --rm -v $(pwd)/files:/mnt/data my-pdf-tool
Обратите внимание: конкретный синтаксис зависит от вашей ОС и версии Docker. В Windows-путях и в старых версиях инструментария команда может отличаться — сверяйтесь с официальной документацией Docker для вашей платформы.
Чтение и сохранение результата
После того как файл найден, обработка идёт обычными средствами выбранной библиотеки. Ниже — минимальный пример извлечения текста и сохранения результата рядом с исходником, чтобы файл можно было забрать из среды.
from pypdf import PdfReader
reader = PdfReader("/mnt/data/document.pdf")
text = "\n".join(page.extract_text() or "" for page in reader.pages)
with open("/mnt/data/result.txt", "w", encoding="utf-8") as f:
f.write(text)
Ключевой момент: результат нужно сохранять именно в /mnt/data, а не во временные каталоги — только смонтированный том переживает завершение сессии. Если после выполнения скрипта файл результата не появился в интерфейсе скачивания, первым делом проверьте, куда именно он был записан.
Почему extract_text() иногда возвращает пустую строку
Это обычно означает, что PDF — скан без текстового слоя: страницы хранятся как изображения. Извлечь текст из них можно только через OCR (например, связкой конвертации страниц в картинки и движка распознавания). Проверить тип документа просто: если при выделении текста в просмотрщике ничего не выделяется — перед вами скан.
Сравнение сред выполнения
Разные платформы по-разному организуют доступ к файлам. Таблица ниже обобщает типовые подходы — конкретные лимиты и пути уточняйте в документации вашего сервиса, так как они меняются.
| Среда | Куда попадают файлы | Сохранность после сессии |
|---|---|---|
| Облачные ноутбуки | Рабочий каталог или /mnt/data | Зависит от тарифа и настроек |
| ИИ-ассистенты с кодом | /mnt/data | Только в рамках сессии |
| Docker-контейнер | Смонтированный том | Сохраняется на хосте |
| CI/CD-пайплайн | Рабочая директория сборки | Артефакты при явной настройке |
⚠️ Внимание: не загружайте в сторонние облачные песочницы PDF с персональными данными, коммерческой тайной или медицинской информацией, если не уверены в политике обработки данных платформы. Для конфиденциальных документов безопаснее локальный контейнер.
Безопасность при обработке недоверенных PDF
Если документ получен из ненадёжного источника, изоляция — не прихоть, а необходимость. PDF может содержать встроенный JavaScript, ссылки на внешние ресурсы и эксплойты под уязвимости парсеров. Песочница ограничивает ущерб, но и внутри неё стоит придерживаться осторожности.
- 🛡️ Используйте актуальные версии библиотек — старые парсеры PDF содержат известные уязвимости;
- 🚫 Не открывайте встроенные вложения и не переходите по ссылкам из недоверенного документа;
- 🧹 Отключайте выполнение JavaScript в просмотрщике, если оно не нужно для работы;
- 📦 Обрабатывайте подозрительные файлы только в одноразовом контейнере без доступа к сети.
Если ничего не помогло
Когда файл на месте, библиотека установлена, а обработка всё равно падает, сузьте поиск. Проверьте, открывается ли PDF в обычном просмотрщике на хосте — возможно, сам файл повреждён при загрузке. Попробуйте минимальный скрипт, который только читает число страниц: если и он падает, проблема в файле или библиотеке, если работает — в логике вашей обработки.
Полезно также посмотреть полный текст ошибки (traceback), а не только её тип: сообщение часто содержит точный путь или номер страницы, на которой произошёл сбой. Для зашифрованных PDF проверьте, не требует ли документ пароль — многие библиотеки выбрасывают отдельное исключение для этого случая.
Частые вопросы
Почему скрипт не видит файл, хотя я его загрузил?
Чаще всего имя файла внутри песочницы отличается от ожидаемого: платформа могла изменить пробелы, регистр или добавить суффикс. Выведите список файлов через os.listdir("/mnt/data") и сверьте точное имя.
Можно ли менять файлы прямо в /mnt/data?
Зависит от режима монтирования. Если том подключен в режиме «только чтение», запись невозможна — результат нужно сохранять в разрешённый каталог или скачивать через интерфейс платформы.
Чем /mnt/data отличается от /tmp в песочнице?
/mnt/data — смонтированный том, который обычно доступен пользователю для загрузки и скачивания. /tmp — внутренний временный каталог контейнера: его содержимое удаляется вместе со средой и недоступно извне.
Какая библиотека лучше для чтения PDF в песочнице?
Универсального ответа нет: pypdf подходит для базовых операций (чтение, слияние, разделение), PyMuPDF быстрее работает с рендерингом и сложной вёрсткой. Для сканов без текстового слоя нужна OCR-связка. Выбор зависит от задачи и от того, что доступно в образе среды.
Пропадут ли мои файлы после закрытия сессии?
В облачных песочницах и средах ИИ-ассистентов — как правило, да: контейнер одноразовый. Скачивайте результаты до завершения сессии. В локальном Docker файлы на смонтированном томе остаются на вашем диске.