Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
volume-already-mounted Linux / DevOps

Docker Compose Error: volume path already mounted — Решение коллизии

Обновлено: 19.08.2026  ·  Официальная база знаний

Архитектура маппинга VFS в Docker Compose и пересечение путей

Ошибка Cannot create container for service: volume path already mounted или overlapping mount paths возникает при инициализации контейнера, когда спецификация монтирования пытается повторно использовать один и тот же целевой каталог внутри контейнера для разных источников, либо когда в системе остался контейнер-сирота (orphan container), удерживающий файловый дескриптор этого монтирования. Также ошибка проявляется при попытке смонтировать родительский каталог и его подкаталог в неверном топологическом порядке.

Бизнес-риски:

Невозможность запуска обновленной версии стека микросервисов, падение процесса автоматического деплоя, десинхронизация состояния данных между контейнерами.

Таблица конфликтов конфигурации томов

Тип конфликтаПример в docker-compose.ymlСуть проблемы
Дублирование цели (Duplicate Target)- ./conf1:/app/config
- ./conf2:/app/config
Два разных источника монтируются в одну и ту же точку файловой системы.
Пересечение поддиректорий- ./data:/var/lib/mysql
- ./data/sub:/var/lib/mysql
Вложенные циклические ссылки файловой системы хоста.
Зависший Orphan-контейнерСтарый контейнер с тем же именем томаПредыдущий экземпляр удерживает bind mount дескриптор.

Пошаговое устранение коллизий монтирования томов

Сценарий 1: Очистка контейнеров-сирот (Orphans) и пересоздание стека

Чаще всего ошибка вызвана тем, что старый контейнер не был корректно удален перед созданием нового:

# Полная остановка стека с удалением контейнеров-сирот
docker compose down --remove-orphans

# Принудительный запуск с пересозданием всех контейнеров
docker compose up -d --force-recreate

Сценарий 2: Анализ и исправление дублирующихся путей в compose-файле

Проверьте блок volumes сервиса на наличие одинаковых целевых путей назначения:

services:
  backend:
    image: myapp:latest
    volumes:
      # ИСПРАВЛЕНИЕ: точечное монтирование конкретных файлов
      - ./default.conf:/app/config/default.conf:ro
      - ./custom.conf:/app/config/custom.conf:ro

Сценарий 3: Очистка зависших анонимных томов

Если compose создает анонимные тома, которые конфликтуют с именованными томами:

# Просмотр неиспользуемых томов (Dangling Volumes)
docker volume ls -f dangling=true

# Очистка неиспользуемых томов
docker volume prune -f

Типовые ошибки администраторов

  • Попытка смонтировать корень '/' хоста в корень '/' контейнера: Это полностью разрушает изоляцию пространств имен и ломает системные вызовы ядра.
  • Переименование сервиса в compose без docker compose down: При переименовании старый контейнер остается запущенным и удерживает точки монтирования.
Стеки Docker Compose регулярно сбоят при обновлении релизов?
ITSTM проведет ревизию инфраструктурного кода, настроит бесшовные деплои без простоя (Zero-Downtime) и устранит конфликты ресурсов.
Практический опыт инженера: При использовании нескольких compose-файлов (например, docker-compose.yml и docker-compose.override.yml) помните, что списки volumes НЕ перезаписываются, а объединяются. Это частая причина дублирования путей монтирования.

Частые вопросы (FAQ)

Что такое orphan container в терминах Docker Compose?

Это контейнер, который был создан предыдущей версией docker-compose.yml, но сервис был удален или переименован в новой версии файла.

Удалит ли команда 'docker compose down --volumes' данные в bind mounts?

Нет. Флаг --volumes (-v) удаляет только именованные и анонимные тома Docker. Папки на хосте (bind mounts) остаются нетронутыми.

Можно ли монтировать отдельный файл поверх смонтированной папки?

Да, Docker позволяет смонтировать папку '/app', а затем отдельным правилом перекрыть конкретный файл '/app/config.json'.

Почему ошибка появляется после аварийной перезагрузки сервера?

Docker стартует раньше, чем освобождаются дескрипторы точек монтирования. Выполните docker compose down и запустите стек заново.