На устройстве не осталось места из-за docker/cron

У меня есть базовый сервер в облаке Google, который просто запускает док-контейнер через cron каждые 30 минут. Я заметил, что команда docker перестала работать, и я получил сообщение об ошибке

docker: Error response from daemon: no space left on device.

Затем я заметил, что получаю эту ошибку, даже когда пытаюсь выполнить автозаполнение в bash, набрав cd path/ и нажав tab. Я понял, что, вероятно, что-то не так с хранилищем, поэтому я попробовал df -h, и это показало следующее:

Filesystem      Size  Used Avail Use% Mounted on
udev            860M     0  860M   0% /dev
tmpfs           175M   19M  157M  11% /run
/dev/sda1       9.7G  9.7G     0 100% /        
tmpfs           871M     0  871M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           871M     0  871M   0% /sys/fs/cgroup
tmpfs           175M     0  175M   0% /run/user/1001

Как видите, /dev/sda1 по какой-то причине заполнен на 100%. Почему это происходит и как я могу это исправить?

Я заметил, что было несколько тысяч запущенных контейнеров докеров, поэтому я удалил это с помощью этой команды:

docker rm -v $(docker ps -a -q -f status=exited)

Теперь использование хранилища составляет 61%, что все еще слишком много.

распространенной причиной является то, что какой-то журнал переполняется /var/log не всегда так, но лучше вы можете попробовать использовать find /var -printf '%s %p\n'| sort -nr | head -10, чтобы увидеть, какие файлы занимают больше всего места на диске. если это что-то внутри /var/log, тогда вам нужно проверить, какое приложение заполняет журналы, и исправить это приложение. запустить это ДЛЯ /var ,/home

P.... 30.05.2019 18:28

@ps Эта команда работает уже более 5 минут. Я подозреваю, что это может быть проблемой. Есть ли способ обойти эту команду?

ninesalt 30.05.2019 18:33

вы можете сделать ctrl + c или с другого терминала kill команду pid из find. Теперь вам придется вручную визуализировать размер файлов.

P.... 30.05.2019 18:44

также еще один распространенный случай, попробуйте вспомнить, выполнял ли кто-то недавно передачу файла в контейнер и оставил файл как есть?

P.... 30.05.2019 18:52

@ps Контейнер запускается автоматически только cron. Никто кроме меня не имеет доступа к серверу. Как мне визуализировать, какие папки занимают место?

ninesalt 30.05.2019 19:39

Вы удаляете свой контейнер после его запуска? Или в docker ps -a много закрытых контейнеров? Необходимы дополнительные сведения о том, что вы используете в cron.

BMitch 30.05.2019 19:41

вы можете попробовать сделать ls -lrt |sort -n -k5 |tail -10, чтобы перечислить 10 самых больших файлов в каталоге. это ручная работа, так как вы не можете запустить команду find. узнать несколько самых больших файлов и вручную наблюдать, что и кто в них пишет

P.... 30.05.2019 19:53

@BMitch Да, там несколько сотен запущенных контейнеров. Я запускаю контейнер в докере только с помощью команды запуска

ninesalt 30.05.2019 20:11

@Bmitch проверь мое последнее редактирование

ninesalt 30.05.2019 20:30

Используйте du, чтобы узнать, где находится весь мусор, или инструмент визуализации дискового пространства. Для начала найдите здесь что-нибудь, что-нибудь, можете удалить, чтобы освободить место. Старый файл журнала. Скачанный установщик. Что бы ни. Просто освободите себе немного места.

tadman 30.05.2019 20:31
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
10
590
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При запуске контейнеров, которые вам не нужно держать в остановленном состоянии, рекомендуется использовать docker run --rm ... для автоматической очистки остановленного контейнера.

Если контейнер создает тома, видимые в docker volume ls, вы, вероятно, захотите очистить их, как только данные больше не понадобятся. с флагом --rm при запуске анонимные тома (которые отображаются как длинный уникальный идентификатор) будут автоматически удалены.

Докер также предоставляет команду:

docker system prune

которые вы можете автоматизировать для очистки образов, контейнеров, сетей и даже томов. Обратите внимание, что вам нужно время, чтобы понять, что делает эта команда, прежде чем запускать ее, и особенно перед ее автоматизацией. При написании этой команды вы можете использовать флаг -f, чтобы обойти подсказку.

Перед запуском обрезки вы можете проверить:

docker system df

чтобы увидеть, сколько диска используется каждым компонентом, и каждый компонент имеет свою собственную команду сокращения, например. docker container prune и docker volume prune, если вы хотите очистить только одну область.

Дополнительные сведения о команде сокращения см. в разделе https://docs.docker.com/engine/reference/commandline/system_prune/.

Другие вопросы по теме