Ошибка «volumes myvolume is not a valid volume mount point»: причины и решение

Ошибка volumes myvolume is not a valid volume mount point появляется при запуске контейнера через docker-compose up или docker run, когда Docker не может интерпретировать указанный том как корректную точку монтирования. Чаще всего причина кроется в синтаксисе секции volumes в файле docker-compose.yml: отсутствует двоеточие между именем тома и путём внутри контейнера, используются недопустимые символы или том не объявлен на верхнем уровне файла.

Проблема блокирует запуск всего стека, поэтому контейнер не стартует вовсе — зависимые сервисы тоже останавливаются. Хорошая новость в том, что ошибка почти всегда связана с конфигурацией, а не с повреждением данных, и исправляется правкой compose-файла за несколько минут. Ниже разберём типовые причины, порядок диагностики и безопасные способы исправления.

Что означает эта ошибка

Docker ожидает, что каждая запись в секции volumes сервиса будет соответствовать одному из допустимых форматов: имя_тома:путь_в_контейнере для именованных томов или ./локальный_путь:/путь_в_контейнере для bind-монтирования. Если строка не поддаётся разбору — например, в ней просто написано myvolume без двоеточия и целевого пути — движок отклоняет её с сообщением о невалидной точке монтирования.

Важно понимать разницу между именованным томом и bind mount. Именованный том управляется самим Docker и хранится в его внутренней директории, а bind mount связывает контейнер с конкретной папкой на хосте. Синтаксис у них похож, но требования к написанию различаются, и путаница между ними — частый источник сбоя.

Типичные причины ошибки

Перед исправлением полезно понять, какая именно из причин применима к вашему случаю. Ниже перечислены сценарии, которые встречаются чаще всего.

  • 📌 В секции volumes сервиса указано только имя тома без целевого пути: - myvolume вместо - myvolume:/data.
  • 📝 Том myvolume не объявлен в верхнеуровневой секции volumes: compose-файла.
  • 🔤 В имени тома используются недопустимые символы — пробелы, заглавные буквы в некоторых контекстах, спецсимволы.
  • 🗂️ Относительный путь bind-монтирования указывает на несуществующую директорию или содержит опечатку.
  • 🧩 Ошибки отступов в YAML: запись попала не в ту секцию или сместилась по уровню вложенности.

Отдельно стоит упомянуть смешение синтаксисов. Если вы скопировали фрагмент из чужого примера, где использовался длинный формат type: volume с ключами source и target, а затем частично переписали его в короткий, результатом может стать гибридная строка, которую Docker не распознаёт.

Как проверить конфигурацию

Первый шаг диагностики — валидация compose-файла встроенными средствами. Команда ниже покажет итоговую конфигурацию после подстановки переменных и укажет на синтаксические проблемы:

docker compose config

Если файл содержит ошибки YAML-структуры, команда сообщит об этом с указанием строки. Если конфигурация валидна, вы увидите полное развёрнутое описание стека — сверьте секцию volumes проблемного сервиса с ожидаемой.

Второй шаг — проверить, существует ли именованный том и корректно ли он создан:

docker volume ls

docker volume inspect myvolume

Если том отсутствует в списке, но должен создаваться автоматически — убедитесь, что он объявлен в верхнеуровневой секции volumes: compose-файла. Без этого объявления Compose попытается трактовать запись как путь на хосте, что и приводит к ошибке валидации точки монтирования.

⚠️ Внимание: не удаляйте существующие тома командой docker volume rm «для чистки», пока не убедитесь, что в них нет нужных данных. Удаление тома необратимо — данные базы или загруженные файлы будут потеряны.
📊 Где именно возникла ошибка у вас?
При docker-compose up
При docker run
При запуске стека из Portainer
При деплое в CI/CD

Пошаговое исправление в docker-compose.yml

Откройте docker-compose.yml и приведите секцию монтирования к корректному виду. Рабочий минимальный пример для именованного тома выглядит так:

services:

app:

image: myimage

volumes:

- myvolume:/var/lib/app

volumes:

myvolume:

Обратите внимание на два обязательных элемента. Внутри сервиса запись содержит двоеточие: слева — имя тома, справа — абсолютный путь внутри контейнера. А на верхнем уровне файла том явно объявлен в секции volumes:, даже если после имени нет дополнительных параметров.

Для bind-монтирования локальной папки синтаксис иной:

volumes:

- ./data:/var/lib/app

Здесь слева от двоеточия — путь на хосте (относительный или абсолютный), справа — путь в контейнере. Убедитесь, что директория ./data существует относительно расположения compose-файла, либо создайте её заранее.

☑️ Проверка перед повторным запуском

Выполнено: 0 / 5

После правок перезапустите стек:

docker compose down

docker compose up -d

Особенности для docker run и разных ОС

При запуске через docker run аналогичная ошибка возникает при неверном флаге -v. Корректный формат:

docker run -v myvolume:/data myimage

Если вы случайно написали -v myvolume без целевого пути, Docker отклонит запуск. То же произойдёт при смешении флагов -v и --mount с несовместимыми параметрами.

На Windows добавляется нюанс с путями: обратные слеши и буквы дисков в bind-монтировании могут требовать особого экранирования в зависимости от терминала. В PowerShell и Git Bash поведение различается, поэтому при проблемах с путями проверьте документацию Docker Desktop для вашего окружения. На macOS и Linux дополнительно проверяйте права доступа к монтируемой директории — хотя ошибка прав обычно выглядит иначе, она может маскироваться под проблему монтирования.

⚠️ Внимание: при смене записи с bind mount на именованный том (или наоборот) старые данные не переносятся автоматически. Если в контейнере хранилась база данных, сначала сделайте резервную копию, иначе после пересоздания контейнера вы увидите пустое хранилище.

Сравнение подходов к монтированию

Критерий Именованный том Bind mount
Управление хранилищем Движком Docker Пользователем вручную
Типичный синтаксис myvolume:/data ./data:/data
Требование объявления в compose Да, в секции volumes верхнего уровня Нет
Подходит для Базы данных, персистентные данные Код, конфиги при разработке
Частая ошибка Пропущено объявление тома Неверный или несуществующий путь

Выбор между подходами влияет и на диагностику: для именованного тома проверяйте его наличие через docker volume ls, а для bind mount — существование папки на хосте и корректность относительного пути относительно расположения compose-файла.

Как посмотреть, куда смонтирован том в работающем контейнере

Выполните docker inspect имя_контейнера и найдите секцию Mounts — там будут поля Source (источник на хосте) и Destination (путь в контейнере). Это помогает убедиться, что монтирование произошло именно так, как задумано.

Что делать, если ошибка осталась

Если после правки синтаксиса ошибка сохраняется, проверьте версию используемых инструментов. Старые версии docker-compose (v1, с дефисом) и новый плагин docker compose (v2, без дефиса) могут по-разному трактовать некоторые конструкции. Уточните, какая версия установлена, командой docker compose version, и сверьтесь с документацией именно для неё.

Также осмотрите файл на предмет невидимых символов: скопированные из веб-страниц фрагменты иногда содержат неразрывные пробелы или табуляцию вместо пробелов, что ломает разбор YAML. Надёжный способ — удалить проблемный блок и набрать его заново вручную.

Наконец, убедитесь, что запуск происходит из той директории, где лежит нужный compose-файл, либо что путь к файлу задан явно через флаг -f. Docker может подхватывать другой docker-compose.yml из текущей папки, и вы будете править один файл, а запускаться — другой.

Частые вопросы

Можно ли использовать заглавные буквы в имени тома?

Имена томов Docker имеют ограничения на допустимые символы. Рекомендуется придерживаться строчных букв, цифр, дефисов и подчёркиваний — это исключает проблемы с валидацией и переносимостью между окружениями.

Чем отличается docker-compose от docker compose?

docker-compose — отдельная утилита первой версии, а docker compose — встроенный плагин Docker второй версии. Вторая версия актуальна и рекомендована; синтаксис команд в основном совпадает, но поведение в отдельных случаях может различаться.

Потеряются ли данные при исправлении compose-файла?

Нет, если вы не удаляете сам том. Именованный том хранится отдельно от контейнера: правка файла и пересоздание контейнера командой docker compose up -d сохраняют данные, если имя тома не изменилось.

Ошибка появляется только на сервере, локально всё работает. Почему?

Возможные причины: другая версия Docker или Compose на сервере, отсутствие директории для bind-монтирования, различия в относительных путях из-за другой рабочей директории. Сравните вывод docker compose config на обеих машинах.

Как полностью пересоздать том с нуля?

Остановите стек командой docker compose down, затем при необходимости удалите том: docker volume rm myvolume. При следующем запуске том будет создан заново, но все прежние данные в нём будут утеряны — предварительно сделайте резервную копию.