У меня есть базовый сервер в облаке 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%, что все еще слишком много.
@ps Эта команда работает уже более 5 минут. Я подозреваю, что это может быть проблемой. Есть ли способ обойти эту команду?
вы можете сделать ctrl + c или с другого терминала kill команду pid из find. Теперь вам придется вручную визуализировать размер файлов.
также еще один распространенный случай, попробуйте вспомнить, выполнял ли кто-то недавно передачу файла в контейнер и оставил файл как есть?
@ps Контейнер запускается автоматически только cron. Никто кроме меня не имеет доступа к серверу. Как мне визуализировать, какие папки занимают место?
Вы удаляете свой контейнер после его запуска? Или в docker ps -a много закрытых контейнеров? Необходимы дополнительные сведения о том, что вы используете в cron.
вы можете попробовать сделать ls -lrt |sort -n -k5 |tail -10, чтобы перечислить 10 самых больших файлов в каталоге. это ручная работа, так как вы не можете запустить команду find. узнать несколько самых больших файлов и вручную наблюдать, что и кто в них пишет
@BMitch Да, там несколько сотен запущенных контейнеров. Я запускаю контейнер в докере только с помощью команды запуска
@Bmitch проверь мое последнее редактирование
Используйте du, чтобы узнать, где находится весь мусор, или инструмент визуализации дискового пространства. Для начала найдите здесь что-нибудь, что-нибудь, можете удалить, чтобы освободить место. Старый файл журнала. Скачанный установщик. Что бы ни. Просто освободите себе немного места.


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