Текст и данные · Инструкция
Docker --mount или -v: что выбрать для bind mount и volume
Docker --mount или -v — это не выбор между двумя разными типами хранилища, а выбор синтаксиса, которым вы описываете.
Короткий ответ
Практическое сравнение docker --mount и -v: bind mount и volume, поведение отсутствующего пути, readonly, примеры команд и типичные ошибки.
Что именно меняется между --mount и -v
`-v` записывает источник, назначение и опции в одной строке через двоеточия, например `-v /srv/app:/app:ro`. `--mount` использует пары ключ=значение: `--mount type=bind,src=/srv/app,dst=/app,readonly`. По документации Docker общий результат для обычного bind mount может быть одинаковым, но второй вариант явно показывает тип, источник и точку назначения. Это особенно полезно в длинных командах, CI и инструкциях, где перепутать порядок полей `-v` проще. Для именованного volume логика та же: `-v data:/var/lib/app` можно заменить на `--mount type=volume,src=data,dst=/var/lib/app`. При этом Docker рекомендует синтаксис `--mount` как более явный и функциональный.
Совет: Если команда пойдёт в документацию проекта или автоматизацию, выбирайте форму, которую проще проверить глазами: обычно это `--mount`.
Главные различия, которые влияют на результат
- Читаемость. Поля type/src/dst названы явно. Поля зависят от позиции через :
- Отсутствующий bind source. По умолчанию ошибка; автосоздание возможно только явно через bind-create-src. Автоматически создаёт отсутствующий source как каталог
- Volume subpath/driver options. Поддерживает расширенные параметры. Набор возможностей уже
- Короткая интерактивная команда. Длиннее. Компактнее
- Read-only. readonly. :ro
Предупреждение: Для bind mount опечатка в source особенно опасна с `-v`: Docker может создать новый пустой каталог. С `--mount` такая ошибка заметнее; `bind-create-src` используйте только когда автосоздание действительно задумано.
Как безопасно перевести команду с -v на --mount
- 1: Сначала определите тип источника. Если слева абсолютный или относительный путь хоста, используйте `type=bind`; если это имя Docker volume, используйте `type=volume`.
- 2: Перенесите левую часть в `src=` или `source=`, а путь внутри контейнера — в `dst=` или `target=`. Для bind mount заранее создайте источник на хосте и проверьте права доступа.
- 3: Перенесите режим только для чтения: `:ro` превращается в `readonly`. Не добавляйте `readonly`, если приложение должно записывать файлы в подключённый каталог.
- 4: Запустите контейнер и проверьте `docker inspect <container>`: в секции Mounts должны совпадать Type, Source, Destination и RW. Это надёжнее, чем судить только по тому, что процесс стартовал.
- 5: Если переносите именованный volume, убедитесь, что имя не перепутано с путём. Именованный volume управляется Docker и не привязан к структуре каталогов хоста так, как bind mount.
Важно: Перед миграцией production-контейнера сохраните точную старую команду или Compose-конфигурацию: это даёт быстрый откат без угадывания параметров.
Bind mount и volume — не одно и то же
Синтаксис флага не определяет, где физически должны жить данные. Bind mount связывает конкретный файл или каталог хоста с путём контейнера; поэтому контейнер зависит от структуры и прав файловой системы хоста. Docker volume, напротив, создаётся и обслуживается Docker и обычно лучше подходит для постоянных данных приложения, которые не нужно редактировать напрямую с хоста. Если задача — подмонтировать исходники, конфиг или локальную папку разработки, bind mount часто естественнее. Если нужно хранить базу данных или состояние сервиса между пересозданиями контейнера, именованный volume обычно устойчивее. В обоих случаях можно использовать и `--mount`, и `-v`, поэтому сначала выбирают тип хранения, а уже затем синтаксис команды.
Что проверить, если после монтирования виден пустой каталог
- Путь источника на хосте существует и написан без опечатки.
- В `docker inspect` тип Mounts соответствует ожиданию: bind или volume.
- Destination внутри контейнера совпадает с путём, из которого приложение читает данные.
- Права пользователя внутри контейнера позволяют читать или записывать подключённые файлы.
- Для `-v` проверьте, не был ли отсутствующий путь автоматически создан как новый пустой каталог.
- Для именованного volume проверьте, не создалось ли другое имя из-за опечатки.
Важно: Не удаляйте volume, пока не убедились, что данные либо не нужны, либо сохранены отдельно. Удаление контейнера и удаление именованного volume — разные операции.
Когда короткий -v всё ещё уместен
`-v` остаётся нормальным синтаксисом для коротких одноразовых команд, когда путь и назначение очевидны, а источник уже существует. Проблема не в самом флаге, а в том, что компактная запись скрывает смысл полей и в bind-сценарии по умолчанию автоматически создаёт отсутствующий источник как каталог. В команде разработчика вроде `docker run --rm -v "$PWD":/work image` это может быть приемлемо, если текущий каталог осознанно выбран. В инфраструктурных примерах лучше дать более явную форму `--mount`, потому что она снижает риск ошибочно принять созданный пустой каталог за корректно подключённый файл. Если нужна редкая опция вроде подкаталога volume или параметров драйвера, `--mount` также становится обязательным или заметно удобнее.
Дополнительный практический нюанс
Есть ещё один практический критерий — переносимость между машинами. Bind mount жёстко зависит от существования конкретного пути на хосте, поэтому команда, работающая на одном сервере, может сломаться на другом из-за иной структуры каталогов или прав. Именованный volume меньше связан с такими деталями. Если цель — переносимый запуск, документируйте не только флаг монтирования, но и ожидания к данным: кто создаёт источник, кому он принадлежит и должен ли контейнер иметь право записи.
Как проверить монтирование до запуска приложения
Для критичного сервиса полезно отделить проверку mount-конфигурации от запуска самого приложения. Создайте временный контейнер с тем же `--mount`, но простой командой чтения каталога, либо сразу проверьте секцию `Mounts` через `docker inspect`: там видны Type, Source, Destination и флаг RW. Для bind mount отдельно убедитесь, что source указывает именно на ожидаемый файл или каталог на хосте, а не на автоматически созданную пустую директорию. Такой тест особенно полезен после переноса команды между Linux, macOS и Windows, где синтаксис путей и работа Docker Desktop различаются. После проверки удалите временный контейнер, не трогая именованный volume с данными.
Что учитывать
Условия меняются. Страница отражает состояние на 2026-09-20; при расхождении с официальной документацией приоритет у первоисточника.
Источники и проверка
Фактическая часть сверена по первичным источникам (в т.ч. Bind mounts). Пример и формулировки — редакция N1RO на 2026-09-20.