Контейнер Docker продолжает расти
У меня есть скрипт Pyhton, который на петле
- Загрузка фрагментов видео из AWS S3 в / имя файла
- Сортирует файлы по порядку и объединяет их.
- Загружает весь обработанный видеофайл в AWS S3
- Удалить папку / имя файла
Затем продолжается в цикле, пока очередь AWS SQS не станет пустой.
Скрипты прекрасно работают! Я управлял им месяцами. Место на жестком диске варьируется, но никогда не получает около 5%, в зависимости от размера видео.
Я решил поместить этот скрипт в контейнер докера и запустить docker-compose, чтобы я мог запускать несколько из них одновременно.
Проблема в том, что жесткий диск заполняется! Я знаю, что с 5 работающими места на диске будут сданы в аренду, но когда я закончу обработку файла, получим удаление.
Но с докером, похоже, кеш или что-то. Я exec в каждый контейнер, и они работают нормально. Удалите старые файлы и все.
Понятия не имею, что разница между в док-контейнере и в качестве службы будет влиять на HD.
Любое направление было бы здорово.
Чтобы добавить к этому. Когда я "rm" докер контейнеры, пространство на жестком диске освобождается. Я запускаю докер ps -s и место на контейнерах не сумасшедшее. Просто кажется, что когда вы "rm" файл внутри контейнера Docker, он никогда не на самом деле.
3 ответа
Если вы загружаете образ в каталог, НЕ привязанный по объему к хосту, контейнер докера не освободит используемое дисковое пространство, пока контейнер не будет удален - все, что сделано в контейнере, является эфемерным, но ХОСТ не знает состояние того, что происходит внутри контейнера.
В этом смысле это очень похоже на образ виртуальной машины, поддерживаемый файлом, который просто увеличивается по мере необходимости, но никогда не сжимается. В Docker есть каталог для отслеживания изменений в работающем контейнере. На хосте вы можете найти файлы, поддерживающие работающий контейнер в /var/lib/docker/containers/<id>
Если вам нужны ваши контейнеры для совместного использования дискового пространства, я бы порекомендовал вам связать общий том с хоста в образы каждого контейнера докера для совместного использования.
Попробуйте следующее
docker run -ti -v /host/dir:/container/dir ubuntu bash
Вышеприведенный пример запускает образ Ubuntu в интерактивном режиме терминала и монтирует каталог хоста. /host/dir
внутри работающего контейнера. Все, что пишет контейнер /container/dir
появится в хозяевах /host/dir
и любые другие контейнеры, монтирующие его, также увидят изменения.
Просто помните, что все, что делается в общем томе, видны во всех контейнерах, которые его монтируют, поэтому будьте осторожны при добавлении и удалении из него файлов / каталогов!
Я бы посоветовал вам использовать тома и монтировать их в свои контейнеры. Изменения томов происходят мгновенно, в отличие от изменений, внесенных в файловую систему контейнеров (которая на самом деле не удаляется до тех пор, пока вы не удалите контейнер).
Посмотрите документы здесь
Две вещи, на которые стоит обратить внимание:
Уровень файловой системы контейнера для чтения/записи. Вы можете получить представление о том, что здесь происходит с
docker diff
на конкретном идентификаторе контейнера, чтобы увидеть все изменения файловой системы, сделанные вашим контейнером.Журналы контейнера. Вы можете просмотреть их с помощью
docker logs
. В долго работающем контейнере они могут стать чрезмерными. См. этот ответ , чтобы узнать, как ограничить размер журнала в одном контейнере или сделать эти ограничения значениями по умолчанию для всех вновь созданных контейнеров.
Наконец, если вы используете Docker внутри виртуальной машины, например, Docker Desktop, вы можете увидеть изменения файловой системы, расширяющие файловую систему виртуальной машины с копированием при записи, которую нелегко отменить. (Базовое устройство не знает, что ОС больше не использует байты, поэтому после замены нулевых байтов данными, даже если FS больше не указывает на эти байты, предполагается, что они используются.) Однако , так как вы указали, что удаление контейнера освобождает место, это вряд ли будет вашей проблемой.
Также маловероятно, что это будет решено с помощью тома, поскольку ваше приложение вносит те же изменения файловой системы в том, что и в слой чтения-записи контейнера. Все, что он будет делать, это сохранять эти изменения между контейнерами.