Docker Error: read-only file system encountered inside container
Механизм защиты VFS и причины перехода файловой системы в режим Read-Only
Ошибка cannot touch: Read-only file system или EROFS: read-only file system возвращается кодом ошибки ядра EROFS (Error 30) при попытке процесса выполнить системный вызов записи (write, mkdir, unlink). Это происходит в трех основных случаях: контейнер явно запущен с флагом --read-only для безопасности, том (Volume / Bind Mount) смонтирован с атрибутом :ro, либо базовая файловая система хоста (ext4/xfs) была принудительно переведена ядром Linux в режим Read-Only из-за сбоя оборудования (I/O hardware error, bad blocks, filesystem corruption).
Бизнес-риски:
Аварийная остановка баз данных (PostgreSQL, MySQL), потеря пользовательских сессий, сбой записи транзакционных логов и повреждение целостности данных.
Таблица сценариев монтирования и прав на запись
| Параметр запуска | Состояние корневой ФС (/) | Состояние томов (/data) |
|---|---|---|
| Стандартный запуск | Read-Write (Слой контейнера overlay2) | Read-Write (Зависит от прав хоста) |
--read-only | Read-Only (Любая запись блокируется) | Read-Write (Если явно указан volume) |
-v /host:/cont:ro | Read-Write | Read-Only (Принудительно запрещена запись) |
Пошаговое восстановление прав на запись в контейнере
Сценарий 1: Исправление флагов монтирования в docker run / compose
Проверьте параметры монтирования и снимите флаг :ro, если приложению требуется запись:
# Исправленный запуск с правами на запись (:rw по умолчанию):
docker run -d -v /data/storage:/app/storage:rw myimage
# В docker-compose.yml:
services:
app:
volumes:
- ./storage:/app/storage:rwСценарий 2: Настройка tmpfs при использовании безопасного флага --read-only
Если в целях hardening контейнер работает с --read-only rootfs, выделите временные разделы в RAM для логов и PID:
# Запуск безопасного контейнера с записью временных файлов в память (tmpfs)
docker run -d \
--read-only \
--tmpfs /tmp \
--tmpfs /var/run \
--tmpfs /var/log \
-v app_data:/app/data:rw \
nginx:alpineСценарий 3: Проверка хостовой файловой системы на ошибки и аварийный remount
Если режим Read-Only включился спонтанно на работающем контейнере, проверьте системный журнал ядра хоста:
# Проверка dmesg на критические ошибки диска
dmesg -T | grep -E 'EXT4-fs error|XFS|I/O error|remount'
# Если диск ушел в RO из-за ошибок, требуется остановка и fsck:
systemctl stop docker
umount /dev/sdb1
fsck.ext4 -y /dev/sdb1
mount /dev/sdb1 /var/lib/docker
systemctl start dockerТиповые ошибки администраторов
- Попытка сменить права через chmod внутри Read-Only ФС: Команда
chmodилиchownвнутри контейнера завершится той же ошибкой EROFS. Права меняются на хосте. - Игнорирование SMART-атрибутов диска: Спонтанный remount в RO — первый признак деградации SSD/HDD или сбоя контроллера RAID.
ITSTM проведет аппаратную диагностику дисковых массивов, настроит мониторинг SMART/I/O и обеспечит целостность ваших данных.
Частые вопросы (FAQ)
Почему база данных PostgreSQL в контейнере внезапно упала в Read-Only?
Служба PostgreSQL при обнаружении ошибок записи на диск немедленно переводит транзакции в Read-Only для защиты от повреждения данных WAL.
Как смонтировать только один файл с правами на запись, а остальные на чтение?
Монтируйте директорию как :ro, а конкретный целевой файл отдельной строкой: -v /host/app.conf:/app/app.conf:rw.
Влияют ли права пользователя (UID/GID) на ошибку Read-only file system?
Нет. При ошибке прав доступа возвращается Permission denied (EACCES). Ошибка EROFS связана исключительно с параметрами монтирования ядра.
Как временно перемонтировать файловую систему в RW без перезагрузки?
На хосте выполните: mount -o remount,rw /mount/point. Если ядро заблокировало диск из-за ошибок, перемонтирование будет отклонено.