Текст и данные · Инструкция
Docker volume read-only: как подключить том только для чтения
Docker volume read-only используют, когда контейнеру нужно читать данные, но нельзя разрешать их изменение. Docker поддерживает два эквивалентных варианта: --mount с readonly/ro и короткую запись -v volume:/path:ro. Один и тот же named volume при этом может быть доступен на запись другому контейнеру — read-only задаётся для конкретного mount.
Короткий ответ
Для read-only volume используйте --mount source=..,destination=..,readonly или краткую форму -v volume:/path:ro. Один и тот же volume может быть read-only в одном контейнере и writable в другом.
Контроль перед завершением
- В Mounts нужного контейнера RW=false.
- Приложение действительно не требует записи в этот путь.
- Другие контейнеры с тем же volume проверены на режим доступа.
Docker volume ro: ключевой принцип
Read-only mount ограничивает запись со стороны конкретного контейнера, а не превращает сам volume навсегда в неизменяемый объект. Docker поддерживает флаг readonly в синтаксисе --mount и суффикс :ro в кратком -v. Один named volume можно подключить к нескольким контейнерам с разными режимами доступа.
Совет: Read-only mount ограничивает запись со стороны конкретного контейнера, а не превращает сам volume навсегда в неизменяемый объект.
Порядок действий
- Создайте или выберите named volume и убедитесь, что в нём есть нужные данные.
- Запустите контейнер с --mount source=VOL,destination=/data,readonly либо -v VOL:/data:ro.
- Внутри контейнера прочитайте существующий файл и попробуйте создать тестовый файл.
- Проверьте docker inspect и убедитесь, что для mount отображается RW=false.
- Если сервису нужна запись в отдельный каталог, смонтируйте второй writable volume именно туда.
Совет: Создайте или выберите named volume и убедитесь, что в нём есть нужные данные.
Readonly volume docker: ограничения и ошибки
Ошибка записи при RW=false ожидаема и не требует chmod 777 внутри контейнера. Read-only полезен для конфигураций, справочников, моделей и других данных, которые процесс должен только читать. Это не защита от контейнера, который имеет другие привилегированные пути к хосту или Docker socket; модель безопасности нужно оценивать целиком. В связанных материалах и настройках встречаются также термины: volume only read, Docker volume permissions.
Предупреждение: Это не защита от контейнера, который имеет другие привилегированные пути к хосту или Docker socket; модель безопасности нужно оценивать целиком.
Практический нюанс
Read-only не означает, что данные защищены от других контейнеров. Если второй контейнер монтирует тот же volume в режиме read-write, он всё равно способен изменить файлы, которые первый контейнер видит только для чтения.
Что проверить в реальном сценарии
Если приложению нужен read-only dataset, вынесите кэш, PID-файлы и временные данные в другой writable path. Тогда `:ro` защищает основной volume от записи, а контейнер не ломается из-за попытки создать служебный файл рядом с данными.
Как убедиться, что задача решена
Проверьте mount командой docker inspect и убедитесь, что у нужной записи RW=false. Практический тест — попытаться создать файл именно в смонтированном каталоге из контейнера: операция должна завершиться ошибкой read-only filesystem или permission denied в зависимости от окружения. Не путайте read-only volume с флагом --read-only, который делает только корневую файловую систему контейнера read-only и решает другую задачу.
Важно: Не используется chmod как обход read-only
Что учитывать
Ошибка записи при RW=false ожидаема и не требует chmod 777 внутри контейнера. Read-only полезен для конфигураций, справочников, моделей и других данных, которые процесс должен только читать. Это не защита от контейнера, который имеет другие привилегированные пути к хосту или Docker socket; модель безопасности нужно оценивать целиком. В связанных материалах и настройках встречаются также термины: volume only read, Docker volume permissions.
Источники и проверка
Фактическая часть сверена по первичным источникам (в т.ч. Volumes). Пример и формулировки — редакция N1RO на 2026-09-23.